2016-01-09 30 views
0

好的我碰到一個奇怪的東西,也許有人可以解釋它。 源代碼是(C++ 11):爲什麼sizeof給出錯誤的答案

‪#‎include‬ <stdio.h> 
struct xyz_ { 
    float xyz[3]; 
    float &x = xyz[0]; 
    float &y = xyz[1]; 
    float &z = xyz[2]; 
}; 

int main(int argc, char *argv[]) 
{ 
    xyz_ xyz; 
    xyz.x = 0; 
    xyz.y = 1; 
    xyz.z = 2; 
    xyz.xyz[1] = 1; 
    printf("as array %f %f %f\n",xyz.xyz[0],xyz.xyz[1],xyz.xyz[2]); 
    printf("as elements %f %f %f\n",xyz.x,xyz.y,xyz.z); 
    int sizexyz = sizeof(xyz); 
    int sizefloat = sizeof(float); 
    printf("float is %d big, but xyz is %d big\n",sizefloat,sizexyz); 
    return 0; 
} 

輸出爲:

as array 0.000000 1.000000 2.000000 
as elements 0.000000 1.000000 2.000000 
float is 4 big, but xyz is 24 big 

因此,結構工程,我所期望的,但尺寸的兩倍大,因爲它應該是。在結構中使用字符而不是浮點數會在運行時出現段錯誤。 我想使用struct xyz_作爲浮點數組或單個浮點元素。

+0

我看到你是縮進代碼的粉絲 –

+0

'使用字符給出段錯誤'不知道這是什麼意思。 – dxiv

+0

爲什麼你認爲24是錯誤的大小?我不會感到驚訝,如果它是40. –

回答

1

如何:

struct xyz_ 
{ 
    float xyz[3]; 
    float &x() {return xyz[0];} 
    float &y() {return xyz[1];} 
    float &z() {return xyz[2];} 
}; 

不一樣美麗或優雅,但可能會降低大小一點,但我覺得this指針可能會佔用額外的空間,不知道...

中當然,你將不得不使用x(),y()z()

+0

向誰downvoted:'''switch'''''如果else''爲三個變量可能會有所幫助,編譯器可以優化,也許,但代碼變得更大。這個更短。 :-) –

+0

剛剛糾正,現在好點? –

+0

是的,這也是我想出來的。 – iplayfast

1

xyz_的大小是多少?

struct xyz_ { 
    float xyz[3]; 
    float *x = &xyz[0]; 
    float *y = &xyz[1]; 
    float *z = &xyz[2]; 
}; 

該引用還需要它自己的空間來存儲它指向的信息。

4

這是未指定是否需要存儲引用。在這種情況下,您的輸出表明您的編譯器已決定使用存儲來實現參考x,yz

-1

C你可以做以下事情,但它在C++11不合法。

union xyz_ { 
    float xyz[3]; 
    struct { float x, y, z; }; 
}; 
+0

這是不合法的? – 6502

+0

向誰投降:是的,我清楚地知道這不是一個答案。同時,它不適合評論,但我相信它與被問到的問題有關。將C和C++翻譯單元混合在同一個最終模塊中並不是那麼不尋常,有時出於像這樣的語言差異的原因。 – dxiv

+0

@ 6502這不是標準。例如[爲什麼C++ 11不支持匿名結構,而C11呢?](http://stackoverflow.com/questions/8622459/why-does-c11-not-support-anonymous-structs-while-c11 -does)。 – dxiv

2

假設你添加另一個構造函數:

struct xyz_ { 
    float xyz[3]; 
    float &x = xyz[0]; 
    float &y = xyz[1]; 
    float &z = xyz[2]; 

    xyz_() 
    { 
    } 

    xyz_(float& a, float& b, float& c) 
     : x(a), y(b), z(c) 
    { 
    } 
}; 

應該明確的是,現在這三個xyz成員可以綁定到數組元素或可以被綁定到別的東西。

看起來你正在尋找的是

union P3d { 
    float xyz[3]; 
    struct { 
     float x, y, z; 
    }; 
}; 

不幸的是,一些奇怪的原因(apparently mostly political)這是不支持的標準(儘管編譯器實際上已支持)。

+0

是的,這是我的目標,我只是認爲參考會更清楚。我將與&x(){return xyz [0]} – iplayfast