gru*_*htr 0 c c++ compiler-construction
c/c ++编译器是否按值将结构推送到堆栈上,如果程序员指定了一个大型结构,则将数百个字节存储到堆栈中?返回的结构是否会受到同样的惩罚?
是的,大多数编译器会推送堆栈,或复制到堆栈值传递结构(和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++标准库的许多容器具有较小的值大小(大多数实际数据通过指针间接访问).细节显然是特定于实现的.
| 归档时间: |
|
| 查看次数: |
190 次 |
| 最近记录: |