`
paddy.w
  • 浏览: 503496 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

结构体的大小——结构体对齐问题

    博客分类:
  • C
 
阅读更多
        C语言中,基本数据类型与操作系统有关(虽然直接与编译器相关),基本没有什么变化。比如在32位操作系统中,int占4个字节,long占4个字节,char占1个字节,double占8个字节。但是结构体的大小并不只与操作系统有关了,与编译器有比较大的关系。
        不同的编译器有不同的对齐方式,下面以32为linux下gcc4.6为例,分析一下gcc中结构体对齐的问题。

        C中可以使用#pragma pack(n)来手动设定对齐数值。gcc默认是4,即按照4字节对齐。一般有如下的对齐规则:
        1、结构体的第一个数据成员的相对位置为0,后续数据成员按n指定的值和该数据成员自身大小中较小的那个进行对齐。
        2、不仅需要数据成员对齐,结构体本身也需要对齐。按照n的值和结构体数据成员中最长的长度中较小的进行对齐。结构体本身对齐即结构体最终的大小须是对齐数值的倍数,且不小于所有数据成员对齐之后的和。
        对齐也即意味着数据的相对地址开始值须是对齐数值的倍数。
struct test {
    int i;//4
    char c;//1
    long l;//4
    double d;//8
}

        i占4字节,c占1字节,l占4字节,d占8字节,使用默认对齐数值4。按照第一条规则,对于i,4=n,按4对齐,则i占据[0,3];对于c,1<n,按1对齐,则c占据[4];对于l,4=n,按4对齐,则l占据[8-11];对于d,8>n,按n=4对齐,则d占据[12-19]。至此数据成员对齐完毕,占据了[0-19]共20个字节。
        接着按照规则2进行结构体本身的对齐。结构体数据成员中最大的是d,占了8个字节,n默认为4,故按照最小值4进行对齐。12是4的倍数,且最接近数据成员大小之和。故此结构体最终的大小是20。
        #pragma pack(n)中n的值之可能是1、2、4。可以用3试一下,编译器回报错。如果用8,编译器不会报错,但是按照规则计算的大小与实际的大小不一致,因为gcc又按照默认的4进行对齐了,可以测试一下,这里不再赘述。
        n=1,n=2的情况与n=4的情况类似,按照规则对齐即可,略。
分享到:
评论

相关推荐

    超越原始的结构体——序列化c++设计消息协议(C++asio网络库相关)

    2、用序列化方式安全性会比reintepret_cast更高,也不用考虑大小端对齐之类的问题 3、与原始C结构体相比可以脱离pod类型的限制定义非常复杂的类,传输复杂的数据 缺点: 1、服务器和客户端语言都需要使用C++ 以下是...

    c++中关于结构体长度的计算问题.pdf

    在C++编程语言中,结构体(struct)的大小计算并不是简单地将所有成员的字节数相加,而是涉及到一个关键概念——字节对齐。字节对齐是指在内存中,数据结构的成员会被安排在特定的地址,以便于提高访问效率。不同...

    C语言——结构体的读取与写入.zip

    这可能会影响结构体的大小(`sizeof(struct Student)`),因此在跨平台编程时需要注意兼容性问题。 此外,如果结构体包含指针或其他复杂类型,比如动态分配的数组,那么在读写时需要额外处理这些内存管理。例如,你...

    第8章 自制容器——结构体和枚举1

    在第8章“自制容器——结构体和枚举”中,我们将深入理解结构体的使用以及相关概念。 首先,结构体的使用方式如下: ```c struct 标识符{ 数据类型 1 成员 1; 数据类型 2 成员 2; … 数据类型 n 成员 n; }; ``...

    C/C++结构体字节对齐详解

     我们先看看sizeof的定义——sizeof的结果等于对象或者类型所占的内存字节数,好吧,那让我们来看看S1的内存分配情况  S1 s1 = { 'a', 0xFFFFFFFF };  定义上面的变量后,加上断点,运行程序,观察s1所在的...

    C语言基础——专栏索引篇

    前言 C语言是编程初学者最需要掌握的一个语言,对C语言了解地足够透彻,对于对其他语言的理解就会更加轻松。而且正是由于其没有...第三课:结构体的内存对齐———————————————————–《内存对齐模式

    VC.zip_dialysis

    "VC.zip_dialysis"这个压缩包,特别是其中的"VC中结构体内存分配问题透析.txt"文件,显然是针对C++编程中的一个重要主题——结构体内存分配进行深入探讨的资料。在这个话题中,我们将详细讨论结构体在Visual C++...

    c语言教程——C语言学习资料

    - 结构体:理解如何定义和使用结构体,以及结构体的内存对齐问题。 - 枚举:了解枚举类型的使用,以及枚举常量的作用。 6. **位运算** - 位操作:掌握位移、按位与、按位或、按位异或等位运算,及其在内存和硬件...

    如何学习C语言——字符表

    结构体的内存对齐会影响其大小,正确计算结构体大小需要考虑编译器的字节对齐规则。 宏是预处理器指令,用于文本替换。它们可以用来简化代码、创建常量或者实现类似函数的功能。然而,宏可能会导致代码难以理解和...

    wvdial移植ARM——修改及增补文件

    这可能涉及到结构体大小、指针对齐、系统调用等。使用`gcc -march=armv7-a`等选项来检查和解决潜在的架构相关问题。 6. **设备驱动适配**: ARM设备的串口驱动可能与x86平台不同。确保WVDIAL能够正确识别和使用ARM...

    bmp文件读写操作C代码

    1. **文件头**:BMP文件头由两个结构体组成——BITMAPFILEHEADER(14字节)和BITMAPINFOHEADER(40字节)。BITMAPFILEHEADER包含了文件类型('BM')和文件大小。BITMAPINFOHEADER包含图像的宽度、高度、颜色深度...

    数据结构与链表,数据结构与链表

    3. **结构体总大小**:为结构体最宽基本类型成员大小的整数倍。 **示例代码** ```cpp #include struct a { char a1; char a2; char a3; } A; struct b { short a2; char a1; } B; int main(void) { printf("%d,...

    09年深信服部分笔试题目

    这篇资料主要涵盖了C++语言的一些基础知识点,包括数据类型的字节数、内存对齐规则、指针操作、字符串处理以及两种C++强制类型转换——`reinterpret_cast`和`static_cast`的使用。以下是对这些知识点的详细解释: 1...

    收录华为笔试题目,有兴趣看下

    - 在没有边界对齐的情况下,结构体 `A` 的大小计算为:`1 + 1 + 4 = 6` 字节。 综上所述,结构体 `A` 的大小为 **6字节**。 ### 5. 额外知识点补充 除了以上题目,给定的部分内容还提到了其他几个知识点,包括...

    839回忆版20181

    在C++中,结构体的大小可能会因为内存对齐规则而大于其成员大小之和,以提高访问效率。例如,如果一个结构体包含一个3字节和一个4字节的成员,其大小可能不是7字节,而是8字节,因为4字节对齐的要求。 【数据结构...

    HP C Programming Guide

    此外,还提供了一些实际示例,展示了在不同系统上结构体对齐的具体效果。 #### 第3章:调用其他语言 这一章节着重讨论了如何在C程序中调用其他语言编写的代码,如Pascal和Fortran。它首先比较了C与这些语言之间的...

    嵌入式linux面试题解析(二)——C语言部分二.rar_C语言部分_C语言面试题_嵌入式linux面试题解析(二)_嵌入式面试

    面试时可能会考察其字节大小、取值范围和类型的转换。 2. **指针与内存管理:** - 指针是C语言的精髓,理解指针的工作原理和操作是必不可少的。面试中可能会问到指针的声明、赋值、解引用、指针算术运算,以及...

    c语言进阶——嵌入式高级C语言编程

    在深入探讨“C语言进阶——嵌入式高级C语言编程”这个主题之前,我们首先需要理解C语言的基础以及它在嵌入式系统中的重要性。C语言是一种强大的、低级的编程语言,以其高效、灵活性和对硬件的直接访问能力而闻名。它...

    程序员面试宝典摘要——有关C/C++的基本概念,亦是面试常用

    - 结构体成员对齐是为了优化内存访问,通常基于处理器的字大小进行对齐,以提高效率。 12. **sizeof操作符**: - `sizeof` 用于计算类型或变量占用的内存字节数,是编译时操作,可用于动态内存分配、结构体布局等...

Global site tag (gtag.js) - Google Analytics