益阳公司网站建设,武安网站建设价格,wordpress开启伪静态,网站的字体做多大合适结构体在C语言程序开发中#xff0c;是不可或缺的语法。不过#xff0c;相信不少C语言初学者遇到过这样的问题#xff1a;为什么结构体的 size 有时不等于它的所有成员的 size 之和呢#xff1f;C语言结构体大小等于它的所有成员大小之和吗#xff1f;举例来说#xff0c…结构体在C语言程序开发中是不可或缺的语法。不过相信不少C语言初学者遇到过这样的问题为什么结构体的 size 有时不等于它的所有成员的 size 之和呢C语言结构体大小等于它的所有成员大小之和吗举例来说假设有结构体它的C语言代码如下请看struct x{short s; int i; char c;};我们继续编写C语言代码依次输出成员 sic 占用内存空间的大小相关代码很简单请看struct x t;printf(%lu %lu %lu\n, sizeof(t.s), sizeof(t.i), sizeof(c));编译并执行这段C语言代码得到如下输出# gcc t.c # ./a.out 2 4 1。那么按理说结构体 x 占用的内存空间应该等于 2417 字节但是似乎实际结果与我们的预期并不一致printf(%lu\n, sizeof(t))。上面这行C语言代码输出的结果是 12这是怎么回事呢程序输出的结果与我们的预期不一致原因在于“对齐机制”。如果将结构体 x 看作是一个容器鉴于成员 sic 的长度参差不齐C语言编译器不得不“填充”一些额外的空间以满足“对齐机制”。数据结构是否对齐不仅影响C语言程序的性能有时甚至还会带来意想不到的错误例如访问未对齐的数据可能会导致硬件方面的问题 (SIGBUS总线错误)导致性能下架以及破坏一些操作的原子性等并发安全保障。所以C语言编译器在处理结构体时如果没有特别的指定一般都会填充一些字节以确保不违背对齐机制。以上面的结构体 x 为例初学者可能会认为它的成员在内存中的布局。但是如果编译器按照下面布局处理器访问之将更加方便不过这样排列结构体 x 的成员会空出一些空间对于处理器来说小心的跳过这些空间还是有些麻烦于是大多数C语言编译器都会像下面这样填充空穴这样一来整个结构体 x 占用内存的空间其实就是成员 i 占用空间的 3 倍了也即 12 字节。事实上我们可以通过排列结构体 x 成员的顺序来优化其占用内存的大小。本节主要讨论了C语言中结构体大小并不一定等于它所有成员大小之和的原因应该注意结构对齐在C语言标准中是 implementation defined不同的C语言编译器可能选择不同的数据对齐方式从而导致不同和不兼容的数据布局。因此在使用不同编译器开发C语言程序时了解编译器是如何对齐数据是很重要的。