【发布时间】:2011-12-01 23:26:09
【问题描述】:
给定以下 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),发现代码生成的大小比以前大了几百倍。
...
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.
【问题讨论】:
-
这是一个疯狂的猜测,但试试这个:vertex_type() : x(), y(), z() {}
-
@AlfP.Steinbach 这正是我文件中的代码。没有别的了。你们有没有检查过代码?它有 {}。它是内联的...
-
@Alf 有问题的构造函数被注释掉了。
-
@Daniel:虽然 C++11 是官方的,但我认为你应该提到你的代码是故意特定于 C++11 的——例如它不会与 MSVC 一起编译。被视为 C++98/03 的代码(充其量)是不完整的。我相应地更改了标签。
标签: c++ gcc compiler-construction g++ c++11