64位系统中struct的内存分配
Memory allocation from struct in 64 bit system
我正在通过旧考试发现这个问题,我必须在 64 位操作系统上为这个特定结构输入字段大小和填充大小:
struct mystruct {
char a;
uint32_t b;
int16_t c;
int64_t d;
};
答案是:
struct mystruct {
char a; //field size: 1, padding size: 3
uint32_t b; //field size: 4, padding size: 0
int16_t c; //field size: 2, padding size: 6
int64_t d; //field size: 8, padding size: 0
};
我明白为什么 int16_t
被分配了 2 个字节和 6 个填充,因为 64 位架构。与 int64_t
.
相同
但是,为什么 char
在 64 位架构中分配了 3 个填充大小,而 uint32_t
分配了 4 个字段大小?
struct mystruct {
char a; //field size: 1, padding size: 3
uint32_t b; //field size: 4, padding size: 0
int16_t c; //field size: 2, padding size: 6
int64_t d; //field size: 8, padding size: 0
};
I do understand why int16_t gets allocated 2 Bytes and 6 padding,
because of the 64 bit architecture. Same with int64_t. But why is the
char allocated with 3 padding size and uint32_t with field size of 4
when its a 64 Bit architecture ?
因为:
char
将从任何偏移量开始。
unit32_t
将从偏移量 mod(4) == 0
.
开始
int16_t
将从偏移量 mod(2) == 0
.
开始
int64_t
将从偏移量 mode(8) == 0
.
开始
因此
offset -> 0 1 4 8 10 16 24
+--------------------+----------------+-------------+
| a | 3byte pad | b | c | 6byte pad | d |
+--------------------+----------------+-------------+
我正在通过旧考试发现这个问题,我必须在 64 位操作系统上为这个特定结构输入字段大小和填充大小:
struct mystruct {
char a;
uint32_t b;
int16_t c;
int64_t d;
};
答案是:
struct mystruct {
char a; //field size: 1, padding size: 3
uint32_t b; //field size: 4, padding size: 0
int16_t c; //field size: 2, padding size: 6
int64_t d; //field size: 8, padding size: 0
};
我明白为什么 int16_t
被分配了 2 个字节和 6 个填充,因为 64 位架构。与 int64_t
.
但是,为什么 char
在 64 位架构中分配了 3 个填充大小,而 uint32_t
分配了 4 个字段大小?
struct mystruct {
char a; //field size: 1, padding size: 3
uint32_t b; //field size: 4, padding size: 0
int16_t c; //field size: 2, padding size: 6
int64_t d; //field size: 8, padding size: 0
};
I do understand why int16_t gets allocated 2 Bytes and 6 padding, because of the 64 bit architecture. Same with int64_t. But why is the char allocated with 3 padding size and uint32_t with field size of 4 when its a 64 Bit architecture ?
因为:
char
将从任何偏移量开始。
开始unit32_t
将从偏移量mod(4) == 0
.
开始int16_t
将从偏移量mod(2) == 0
.
开始int64_t
将从偏移量mode(8) == 0
.
因此
offset -> 0 1 4 8 10 16 24
+--------------------+----------------+-------------+
| a | 3byte pad | b | c | 6byte pad | d |
+--------------------+----------------+-------------+