是否将按值传递的结构推入堆栈?

gru*_*htr 0 c c++ compiler-construction

c/c ++编译器是否按值将结构推送到堆栈上,如果程序员指定了一个大型结构,则将数百个字节存储到堆栈中?返回的结构是否会受到同样的惩罚?

Bas*_*tch 5

是的,大多数编译器会推送堆栈,或复制到堆栈值传递结构(和classes).ABI(应用程序二进制接口)规范通常需要相对于编译器和处理器和操作系统.

有关详细信息,请参阅例如X86调用约定System V ABI x86-64(至少对于Linux,x86-64).

实际上,大型结构位于堆栈中,通过寄存器(静默地)传递指向它们的指针.

ABI定义这些结构是否在呼叫者或被呼叫者呼叫帧中......

对于双字大小的struct-s,Linux x86-64 ABI经常通过一对寄存器传递它们(作为参数和结果).

使用GCC,尝试编译使用gcc -O -S -fverbose-asm foo.c以获取汇编代码foo.s; 您也可以使用GCC MELT探针gcc -fdump-tree-all了解内部(Gimple)表示.

请注意,classC++ 中一些非常复杂的可能具有较小的值大小,因为内部涉及很多指针.例如,在Linux/AMD64 sizeof(std::string)上只有一个(8字节)字(包含指向某些复杂内容的指针),它可能通过寄存器传递.同样,C++标准库的许多容器具有较小的值大小(大多数实际数据通过指针间接访问).细节显然是特定于实现的.