gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:41:23 25 4
gpt4 key购买 nike

如果程序员指定一个大结构,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com