簡體   English   中英

內存中繼承類型的排序

[英]Ordering of inherited types in memory

無論如何,我可以假設類成員的內存位置按照它們在定義中出現的順序嗎?

struct Color {
    uint8 r, g, b;
};
struct Vec3 {
    float x, y, z;
};

struct Object : public Color, Vec3 {
    uint32 data;
}object;

換句話說, object.r總是在object.x之前,而object.x本身總是在object.data之前?

或者更具體地說,以下代碼是否始終適用?

assert( offsetof(Object, b)    ==  offsetof(Color, b) );
assert( offsetof(Object, z)    ==  sizeof(Color) + offsetof(Vec3, z) );
assert( offsetof(Object, data) ==  sizeof(Color) + sizeof(Vec3) );

您的類Object不是標准布局,因為它的(直接和間接)非靜態數據成員並非都在同一個類中聲明。

因此,幾乎唯一的保證是在同一類中聲明並具有相同訪問說明符的成員根據其聲明順序進行排序:

r < g < b
x < y < z

並且子對象的子對象的順序是一致的,即如果data < rdata < b等等。

(名稱應該代表這里的地址。)

我認為 C++ 標准沒有任何其他保證,但您的平台使用的 ABI 會更詳細地說明這一點。

順便說一下,由於該類不是標准布局,因此offsetof在 C++14 中具有未定義的行為(並且自 C++17 以來僅受條件支持)。

即使滿足了排序要求,也不需要滿足斷言,因為子對象之間可能存在填充。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM