6.5.2.5p5 говорит
Если составной литерал встречается вне тела функции, объект имеет статическую продолжительность хранения; в противном случае он имеет автоматическую продолжительность хранения, связанную с окружающим блоком.
Правильно ли я интерпретирую «вмещающий блок» здесь как «самый внутренний вмещающий блок»? (Потому что если он не самый внутренний, то какой?) Почему gcc и clang ведут себя так, как будто время жизни литералом была его объемлющая функция?
Пример:
long foo(long*);
void call_foo()
{
{foo(&(long){42});}
{foo(&(long){42});}
{foo(&(long){42});}
{foo(&(long){42});}
}
//for comparison
void call_foo2()
{
{long x=42;foo(&x);}
{long x=42;foo(&x);}
{long x=42;foo(&x);}
{long x=42;foo(&x);}
}
Код, сгенерированный gcc/clang в -O3:
call_foo:
sub rsp, 40
mov rdi, rsp
mov QWORD PTR [rsp], 42
call foo
lea rdi, [rsp+8]
mov QWORD PTR [rsp+8], 42
call foo
lea rdi, [rsp+16]
mov QWORD PTR [rsp+16], 42
call foo
lea rdi, [rsp+24]
mov QWORD PTR [rsp+24], 42
call foo
add rsp, 40
ret
call_foo2:
sub rsp, 24
lea rdi, [rsp+8]
mov QWORD PTR [rsp+8], 42
call foo
lea rdi, [rsp+8]
mov QWORD PTR [rsp+8], 42
call foo
lea rdi, [rsp+8]
mov QWORD PTR [rsp+8], 42
call foo
lea rdi, [rsp+8]
mov QWORD PTR [rsp+8], 42
call foo
add rsp, 24
ret
{ }
, где они объявлены. Или, если они находятся вне функции, они имеют область действия файла и продолжительность статического хранения — как и любая другая переменная. Что касается того, почему вы получаете этот машинный код, я не знаю. Кажется действительно странным. Я ожидаю, что он будет повторно использовать одну и ту же область стека. - person Lundin   schedule 07.12.2017-std=c++11 -pedantic-errors
. - person Lundin   schedule 07.12.2017-x c
, но этот вопрос касается только C, а не C++. (Практически локально сгенерированная программа, скомпилированная с помощьюgcc
, ведет себя в этом отношении так же, как и примерg++ -x c
Compiler Explorer.) - person PSkocik   schedule 07.12.2017lea
, за которой следует адрес, который изменяется на 0x11 для каждого вызова. Странно - я не могу этого объяснить. Может ли это быть из-за ASLR? - person Lundin   schedule 07.12.2017