gpt4 book ai didi

c++ - 奇怪的 GCC 行为

转载 作者:IT老高 更新时间:2023-10-28 22:04:44 25 4
gpt4 key购买 nike

给定以下 C++ 代码:

struct vertex_type {
float x, y, z;

//vertex_type() {}
//vertex_type(float x, float y, float z) : x(x), y(y), z(z) {}
};

typedef struct {
vertex_type vertex[10000];
} obj_type;

obj_type cube = {
{
{-1, -1, -1},
{1, -1, -1},
{-1, 1, -1},
{1, 1, -1},

{-1, -1, 1},
{1, -1, 1},
{-1, 1, 1},
{1, 1, 1}
}
};

int main() {
return 0;
}

当我将(当前已注释掉的)构造函数添加到 vertex_type 结构中时,编译时间突然增加了 10-15 秒。被难住了,我查看了 gcc 生成的程序集(使用 -S),发现 code-gen 的大小比以前大了几百倍。

...
movl $0x3f800000, cube+84(%rip)
movl $0x3f800000, cube+88(%rip)
movl $0x3f800000, cube+92(%rip)
movl $0x00000000, cube+96(%rip)
...
movl $0x00000000, cube+119996(%rip)
...

通过省略构造函数定义,生成的程序集完全不同。

.globl cube
.data
.align 32
.type cube, @object
.size cube, 120
cube:
.long 3212836864
.long 3212836864
.long 3212836864
.long 1065353216
.long 3212836864
.long 3212836864
.long 3212836864
.long 1065353216
.long 3212836864
.long 1065353216
.long 1065353216
.long 3212836864
.long 3212836864
.long 3212836864
.long 1065353216
.long 1065353216
.long 3212836864
.long 1065353216
.long 3212836864
.long 1065353216
.long 1065353216
.long 1065353216
.long 1065353216
.long 1065353216
.zero 24
.text

显然编译器生成的代码有很大的不同。这是为什么?另外,为什么 gcc 在一种情况下将所有元素归零而不是另一种情况?

编辑:我正在使用以下编译器标志:-std=c++0x with g++ 4.5.2.

最佳答案

这是一个长期存在的missing optimization in GCC .它应该能够为这两种情况生成相同的代码,但它不能。

没有构造函数,你的 vertex_type 是一个 POD 结构,GCC 可以在编译时初始化静态/全局实例。使用构造函数,它所能做的最好的事情就是在程序启动时生成代码来初始化全局。

关于c++ - 奇怪的 GCC 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7670110/

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