將雙精度數組轉換爲由雙精度值構成的結構可以嗎?將雙數組轉換爲雙精度結構
struct A
{
double x;
double y;
double z;
};
int main (int argc , char ** argv)
{
double arr[3] = {1.0,2.0,3.0};
A* a = static_cast<A*>(static_cast<void*>(arr));
std::cout << a->x << " " << a->y << " " << a->z << "\n";
}
這將打印1 2 3
。但是它保證每次使用任何編譯器都能正常工作嗎?
編輯:根據
9.2.21:一個指針到一個標準的佈局結構對象,適當地轉換的α使用reinterpret_cast,指向其初始成員(...),反之亦然。
,如果我代替我的
struct A
{
double & x() { return data[0]; }
double & y() { return data[1]; }
double & z() { return data[2]; }
private:
double data[3];
};
int main (int, char **)
{
double arr[3] = {1.0,2.0,3.0};
A* a = reinterpret_cast<A*>(arr);
std::cout << a->x() << " " << a->y() << " " << a->z() << "\n";
}
代碼,那麼它是保證工作。正確?我明白,許多人不會覺得這是令人愉快的,但是在使用結構而不必複製輸入數組數據方面有優勢。我可以在該結構中定義成員函數來計算標量和向量乘積,距離等,這將使我的代碼比我使用數組更容易理解。
如何
int main (int, char **)
{
double arr[6] = {1.0,2.0,3.0,4.0,5.0,6.0};
A* a = reinterpret_cast<A*>(arr);
std::cout << a[0].x() << " " << a[0].y() << " " << a[0].z() << "\n";
std::cout << a[1].x() << " " << a[1].y() << " " << a[1].z() << "\n";
}
這也能保證工作或編譯器可以把一些數據成員經過這麼說sizeof(A) > 3*sizeof(double)
?是否有任何可移植的方法來防止編譯器這樣做?
任何人都可以編寫一個編譯器,所以這是一個棘手的問題。爲什麼不指定要使用的編譯器?我的猜測是,所有主要的編譯器都處理這個問題,它確實有效。 –
由於[數據結構對齊](https://en.wikipedia.org/wiki/Data_structure_alignment) –
,您很可能沒有(如果您不想使用雙倍存在的情況)您打破了嚴格的別名規則。 – Jarod42