C++ 中的内存模型:为什么结构中的两个整数分配在同一内存位置?
Memory model in C++: Why are the two integers in struct allocated in the same memory location?
参考我在下面粘贴的 cppreference.com 处的代码片段,为什么整数 b
和 c
分配在相同的内存位置:
struct S {
char a; // memory location #1
int b : 5; // memory location #2
int c : 11, // memory location #2 (continued)
: 0,
d : 8; // memory location #3
struct {
int ee : 8; // memory location #4
} e;
} obj; // The object 'obj' consists of 4 separate memory locations
我的理解是,例如,在 1 字节 = 8 位的系统中,变量 a
将占用 1 字节。然后 b
会占用 4 个字节。如果 b
和 c
进入相同的内存位置,将填充 8 个字节,这是否意味着 8 个 char
变量可以连续分配在相同的内存位置?
此外,如果 b
或 c
具有相同的内存位置,程序如何知道访问哪里?
您错过了 :5
和 :11
。
确保你知道他们做什么。它是创建位域的语法。 (感谢 Nate 提醒疲倦的我这个词并提供有用的 link https://en.cppreference.com/w/cpp/language/bit_field )
基本上他们说 "only 5 and 11 bits needed, feel free to squeeze them into one int
".
这假设很可能 int
在您的环境中至少为 16 位(压缩两个)或至少 24 位(压缩第三个)。
当您说 "same memory location" 时,这是正确的,它们位于相同(可能)32 位位置,但不完全位于同一内存中。它们处于不同的位置。所以系统以某种方式访问它们(取决于硬件而不是定义),它只使用部分位。您可能会将其视为 compiler/CPU 进行一些移位和屏蔽,但只是作为所发生情况的模型。
参考我在下面粘贴的 cppreference.com 处的代码片段,为什么整数 b
和 c
分配在相同的内存位置:
struct S {
char a; // memory location #1
int b : 5; // memory location #2
int c : 11, // memory location #2 (continued)
: 0,
d : 8; // memory location #3
struct {
int ee : 8; // memory location #4
} e;
} obj; // The object 'obj' consists of 4 separate memory locations
我的理解是,例如,在 1 字节 = 8 位的系统中,变量 a
将占用 1 字节。然后 b
会占用 4 个字节。如果 b
和 c
进入相同的内存位置,将填充 8 个字节,这是否意味着 8 个 char
变量可以连续分配在相同的内存位置?
此外,如果 b
或 c
具有相同的内存位置,程序如何知道访问哪里?
您错过了 :5
和 :11
。
确保你知道他们做什么。它是创建位域的语法。 (感谢 Nate 提醒疲倦的我这个词并提供有用的 link https://en.cppreference.com/w/cpp/language/bit_field )
基本上他们说 "only 5 and 11 bits needed, feel free to squeeze them into one int
".
这假设很可能 int
在您的环境中至少为 16 位(压缩两个)或至少 24 位(压缩第三个)。
当您说 "same memory location" 时,这是正确的,它们位于相同(可能)32 位位置,但不完全位于同一内存中。它们处于不同的位置。所以系统以某种方式访问它们(取决于硬件而不是定义),它只使用部分位。您可能会将其视为 compiler/CPU 进行一些移位和屏蔽,但只是作为所发生情况的模型。