不同编译器的 sizeof(struct) 不同
sizeof(struct) different for different compilers
假设我有这样的代码:
#include <stdio.h>
#include <stdint.h>
int main(int argc, char *argv[]) {
typedef struct{
uint16_t x : 9;
uint8_t y : 7;
} z;
printf("sizeof(z) = %lu\n",sizeof(z));
}
我在 Mac 上对 clang 有不同的结果 (2),有人告诉我 Windows 它返回了 (3)。不确定我是否理解得很好,但我看到虽然第一个编译器将结构压缩为 9+7 = 16 位,但另一个使用 uint16_t 的 16 位和 uint8_t 的 8 位。你能建议一下吗?
不确定我是否理解得很好,但我看到当第一个编译器将结构压缩到 9+7 = 16 位时,另一个使用 uint16_t 的 16 位和 uint16_t 的 8 位uint8_t。你能给点建议吗?
关于位域,首先要记住的是来自 K&R 的这句话,第二:
(6.9 Bit-fields) "Almost everything about fields is implementation-dependent."
它包括填充、对齐和位字节顺序。
可能会出现两种可能的问题:
位域是 ANSI C 规范中标准化程度很低的部分。编译器选择如何在位域中分配位 container.You 应避免在结构内部使用它们,而可以使用 #define 或枚举。
第二个可能的问题是,编译器将通过添加填充来将结构放置在内存中,以确保下一个对象与 object.It 的大小对齐,这是放置结构元素的良好做法根据他们的大小:
typedef struct{
uint8_t x : 7;
uint16_t y : 9;
} z;
假设我有这样的代码:
#include <stdio.h>
#include <stdint.h>
int main(int argc, char *argv[]) {
typedef struct{
uint16_t x : 9;
uint8_t y : 7;
} z;
printf("sizeof(z) = %lu\n",sizeof(z));
}
我在 Mac 上对 clang 有不同的结果 (2),有人告诉我 Windows 它返回了 (3)。不确定我是否理解得很好,但我看到虽然第一个编译器将结构压缩为 9+7 = 16 位,但另一个使用 uint16_t 的 16 位和 uint8_t 的 8 位。你能建议一下吗?
不确定我是否理解得很好,但我看到当第一个编译器将结构压缩到 9+7 = 16 位时,另一个使用 uint16_t 的 16 位和 uint16_t 的 8 位uint8_t。你能给点建议吗?
关于位域,首先要记住的是来自 K&R 的这句话,第二:
(6.9 Bit-fields) "Almost everything about fields is implementation-dependent."
它包括填充、对齐和位字节顺序。
可能会出现两种可能的问题:
位域是 ANSI C 规范中标准化程度很低的部分。编译器选择如何在位域中分配位 container.You 应避免在结构内部使用它们,而可以使用 #define 或枚举。
第二个可能的问题是,编译器将通过添加填充来将结构放置在内存中,以确保下一个对象与 object.It 的大小对齐,这是放置结构元素的良好做法根据他们的大小:
typedef struct{
uint8_t x : 7;
uint16_t y : 9;
} z;