c++ - 按值传递结构是否被压入堆栈?

标签 c++ c compiler-construction

如果程序员指定一个大结构,c/c++ 编译器是否按值将结构压入堆栈,将数百个字节 memcopy 到堆栈?返回的结构会招致同样的惩罚吗?

最佳答案

是的,大多数编译器确实压入堆栈,或复制到堆栈值传递结构(和 classes)。 ABI 通常需要它与编译器、处理器和操作系统相关的(应用程序二进制接口(interface))规范。

参见例如X86 calling conventions & 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 probegcc -fdump-tree-all 以了解内部 (Gimple) 表示。

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

关于c++ - 按值传递结构是否被压入堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18037752/

相关文章:

c++ - 如何将 CSS 样式类添加到 QWidget

c++ - Qt :what is the best way to implement sleep function inside QThread?

c++ - 在 C++ 中,是否可以调和基于堆栈的内存管理和多态性?

c - 如何比较 Rcpp 和 C 的性能?

c - C 中的信号处理

compiler-construction - 编译循环依赖是如何工作的?

c - 我的c程序运行完成后崩溃了

c++ - 遗产。从父类调用子类函数

c - 将新节点插入到双向链表中给定节点之后

c# - 词法分析器和解析器之间的通信