struct s11
{
alignas(16) char s;
int i;
};
是否
alignas(n) X x意味著它會分配 n 個位元組來保存 aX,當X實際上比 n 位元組小得多時,其余記憶體將全部為 0?什么時候
s11.s在記憶體中0x0,這是否意味著s11.i將在0x10?然而,以下pdiff是0x4
s11 o;
ptrdiff_t pdiff = (char*)&o.i - (char*)&o.s;
- 請解釋為什么
sizeof(s11)不是 16 乘以 2,sizeof(s1)而是 8 乘以 3?
struct s1
{
char s;
double d; // alignof(double) is 8.
int i;
}
編輯:這是我在大量挖掘和代碼片段后發現的,即 alignas 如何影響結構(類)大小。
alignas(n) X x 表示在記憶體x中位于偏移多個n位元組的位置,從 0x00 開始。因此,s11.s可以位于0x00、0x10、0x20等。因為s11.s是第一個欄位,它在0x00處,并且是一個字符,所以它占用1個位元組。
第二個欄位也是如此。int有一個對齊 4,因此它可以位于 0x00、0x04、0x08、0x0c 等。因為第一個位元組被 占用s11.s,所以s11.i位于 0x04。
uj5u.com熱心網友回復:
struct 中使用 alignof 運算子時是否會影響 sizeof
您沒有使用alignof運算子。您正在使用alignas說明符。
使用alignas說明符不一定會影響類的大小,但會影響它。
- alignas(n) X x 是否意味著它將分配 n 個位元組來保存 X,當 X 實際上遠小于 n 個位元組時,其余記憶體將全部為 0?
不。如果有填充,則不能保證它全是 0。此外,存在記憶體可能被其他成員占用的情況。
- 當 s11.s 在記憶體 0x0 中時,這是否意味著 s11.i 將在 0x10?
不。
- 請解釋為什么 sizeof(s11) 不是 16 乘以 2
可能是因為它不需要。這是一個滿足對齊要求的示例布局:
offset member
0 s
1 padding
2 padding
3 padding
4 i
5 i
6 i
7 i
8 padding
9 padding
10 padding
11 padding
12 padding
13 padding
14 padding
15 padding
而 sizeof(s1) 是 8 乘以 3?
這是一個滿足對齊要求的示例布局:
offset member
0 s
1 padding
2 padding
3 padding
4 padding
5 padding
6 padding
7 padding
8 d
9 d
10 d
11 d
12 d
13 d
14 d
15 d
16 i
17 i
18 i
19 i
20 padding
21 padding
22 padding
23 padding
我的示例適用于 double 為 8 個位元組且 int 為 4 的系統。
uj5u.com熱心網友回復:
不,這意味著成員的起始地址
s必須在 16 位元組邊界上對齊。可能在它是結構的第一個成員的情況下,這將導致結構本身采用該對齊方式而不影響大小。不,沒有與成員有關的特定對齊方式
i,因此適用正常對齊規則。如果你得到了,4那么你的系統正在使用大小為 4 位元組的整數,并且類似地對齊。填充位元組的值未指定。第一個解釋是在我對#2 的回答中。后續包含對 #1 的答案,由于所需的結構對齊,大小可能為 16。并且
sizeof(s1)是 8 乘以 3,因為double成員的對齊要求導致其他地方填充,結合整個結構的對齊。將char成員移動到結構的末端將減少總大小。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/382465.html
標籤:C
上一篇:C 計算器檢查
