Mahagam:
Korben_Dallas:
В упор не вижу, как тут что-то может поменяться от `const`. Поясните.
строка hello world линкуется в секцию .const, а не пихается в стек, и получает нормальный адрес и незатираемое (как у всего на стеке) значение.
собственно, так оно у меня и получилось.
Вы несете какую-то чепуху. Данная функция возвращает указатель на `hw`. Массив `hw` в моем примере - локальный массив и никакой `const` тут ничего никогда поменять не сможет.
Строковый литерал в С и С++ действительно является объектом со static storage duration (это та самая ваша секция .const), но данная функция возвращает указатель на локальный массив, а не на строковый литерал. Да и генерировать такой строковый литерал уважающий себя компилятор будет только в том случае, если 1) этот литерал кому-то нужен как lvalue, 2) если литерал большой. В данном примере ни одно из этих условий не выполняется. И в данном случае возвращаемое значение функции никакого отношения к этой статической строке в .const не имеет. (Поэтому выдумывать про то, что у вас там что-то "получилось" не надо.)
Никому в данном конкретном примере никакая строка "с нормальным адресом" не нужна. Что легко видеть и на примере сгенерированного GCC кода: https://godbolt.org/g/bdFyVK . Как видите, компилятор не стал генерировать никакой строки в .const, а просто проинициализировал локальный массив при помощи пары числовых констант
movabs rax, 8022916924116329800
mov QWORD PTR [rsp+4], rax
mov DWORD PTR [rsp+12], 6581362
Просто и разумно.
Mahagam:
Korben_Dallas:
Стандартные языки С и С++ никогда не следовали такой логике.
но до прихода великих оптимизаторов всё так и работало.
... но не имело никакого отношения к языку С. А разнообразные кул-хацкеры, которые "теорию" читать не любят, а считают, что всему научатся на "практике", приняли это "все работало" за некую незыблемую истину (как Василий Иванович с Петькой в анекдоте про "безногий таракан - не слышит" ). В результате получаются изумленные казусы из разряда "у Коляна из третьего подъезда это всегда работало". Профессиональные С программисты смотрят на беднягу с сожалением...
Mahagam:
в случае с "вечным циклом" - сами gcc`шники пишут про то, что арифметика у них с переполнением по модулю, и сами же не следуют своей логике.
Вы снова что-то выдумываете. Арифметика с переполнением по модулю в С и С++ существует только для беззнаковых типов. Ничего подобного для знаковых типов никто в GCC вам никогда не обещал.
Добавлено спустя 39 секунд
Mahagam:
Korben_Dallas:
пользуется свободой
путая понятия "тип" и "число". отсюда и проблема
Опять какое-то вождение вилами по манной каше пошло.
Добавлено спустя 7 минут 44 секунды
Mahagam:
нормальный ICC - всё сделал как надо.
"Наивные" реализации компиляторов языка С, ведущие себя по правилам абстрактной С машины, т.е. вот так вот по шагам, как вы описываете - это смешная игрушка, уровня курсача блондинки-превокурсницы (ну или второкурсницы). "Нормальным" он никем никогда считаться не будет. Как раз наоборот: такой компилятор с гомерическим хохотом выгонят с рынка сцаными тряпками, ибо никому он такой не нужен.
Однако я не стану огульно причислять в этой категории ICC, опыт общения с которым у меня весьма ограничен. Дело тут скорее всего не в ICC, а в том, что вы просто не умеете им правильно пользоваться.
Добавлено спустя 2 минуты 29 секунд
gooblin:
Korben_Dallas:
В упор не вижу, как тут что-то может поменяться от `const`. Поясните.
может он имел ввиду static?
Согласно тому, что он написал, он просто не понимает разницы между локальным массивом `hw`и строковым литералом, использованным в качестве инициализатора для этого локального массива.
При чем здесь `const`, однако, до сих пор не понятно.
Добавлено спустя 8 минут 58 секунд
stoGramm:
Народ, Вы запугали тех кто хочет начать карьеру айтишника.
Что, лучше про потенцию?
А вообще, как кто-то когда-то метко заметил, "Первая вещь, которую вы должны усвоить про язык С - это то, что в С массив является указателем. Следующая вещь, которую вы должны усвоить про язык С - это то, что в С массив НЕ является указателем."
Если вы хотите быть С или С++ программистом, то вам, иносказательно выражаясь, придется пройти через оба этапа, как бы страшно вам ни было. В реальной жизни же придется сталкиваться с воинствующими "прохвессионалами", которые навсегда застряли на первом, и при этом искренне верят в то, что знают язык.