Với C++ mã sau:Strange GCC Behavior
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;
}
Khi tôi thêm (hiện nhận xét ra) nhà xây dựng vào vertex_type
struct, nó đột ngột 10-15 tăng thứ hai trong thời gian biên dịch. Stumped, tôi nhìn vào lắp ráp được tạo ra bởi gcc (sử dụng -S
), và nhận thấy rằng kích thước mã gen là lớn hơn vài trăm lần so với trước đây.
...
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)
...
Bằng cách bỏ định nghĩa hàm tạo, hội đồng được tạo khác hoàn toàn.
.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
Rõ ràng có sự khác biệt đáng kể trong mã do trình biên dịch tạo ra. Tại sao vậy? Ngoài ra, tại sao gcc không phải tất cả các phần tử trong một tình huống và không phải là yếu tố khác?
chỉnh sửa: Tôi đang sử dụng cờ trình biên dịch sau: -std=c++0x
với g ++ 4.5.2.
Đây là một dự đoán hoang dã, nhưng hãy thử điều này: vertex_type(): x(), y(), z() {} – Pubby
@ AlfP.Steinbach Đây là chính xác mã tôi có trong hồ sơ của mình. Không có gì khác cả. Bạn đã kiểm tra mã chưa? Nó có {}. Nó là nội tuyến ... – dcousens
@Alf các nhà thầu trong câu hỏi được nhận xét. – zwol