`

struct结构体内的对齐问题

阅读更多
struct结构体由于包含了不同的数据类型,而数据结构类型之间存在占用空间大小的问题,比如char型占用1字节,short int占用2字节,int、long int、指针、float占用4字节、double占用8字节(windows和linux中)。但计算机系统对基本数据类型可能允许地址做出了限制,要求某种类型的对象必须是2、4或8的倍数(为了简化处理器和存储系统之间的硬件设计——可以节省至少1根地址线)。

那么对于给出的一个struct类型数据,我们如何判断它占用多少空间呢?

很简单!我们按照对齐原则即可做出正确判断。但记住:即不是像某些教程说的用struct结构体中占用空间最大的那个变量的字节数乘以变量总数,也不是所有变量占用空间总和,然后补齐到占用最大空间变量所占用字节数的倍数。

那么,到底如何计算呢?

举个例子就明白了:

struct
{
  int i;
  char j;
  int k;
  char r;
  int s;
}s;
sizeof s = ?
答案是20。

struct
{
  int i;
  char j;
  char r;
  int k;
  int s;
}s;
sizeof s = ?
答案是16。

struct
{
  double i;
  char j;
  char r;
  int k;
  int s;
}s;
sizeof s = ?
答案是20。

struct
{
  double i;
  char j;
  int k;
  char r;
  int s;
}s;
sizeof s = ?
答案是24。

struct
{
  double i;
  char j;
  short k;
  char r;
  short s;
}s;
sizeof s = ?
答案是16。

看出问题了吗?计算机系统按照struct中除了double外的变量类型中最大占用空间的字节数对齐。所以才有了上述结果。注意char在被int变量隔离开的时候,1个char也占用4字节,但两个char甚至4个char紧挨着存放时则均只占用4个字节(访问char变量按1的倍数访问,这样看来,CPU和存储器之间的地址线也不能减少,因为有可能访问到某地址,其最后一位也是1)。
1
0
分享到:
评论
1 楼 a_10jqka_2010 2010-02-05  
你要是换一换编译选项,结果还会有可能不一样!

相关推荐

    C结构体对齐详解(结构体成员对齐)

    2. 结构体内各数据成员的内存对齐,即该数据成员相对结构体的起始位置 结构体大小的计算方法和步骤: 1. 将结构体内所有数据成员的长度值相加,记为 sum_a。 2. 将各数据成员为了内存对齐,按各自对齐模数而填充的...

    C语言结构体内存对齐问题.pdf

    结构体的使用提高了程序对数据的组织能力,但随之而来的内存对齐问题,是一个影响性能和内存使用的细节问题。下面我们详细讨论结构体内存对齐的概念、原因以及如何影响结构体的总大小。 1. 内存对齐的基本概念 在...

    字节对齐小结

    - 结构体(struct):结构体内的每个成员都按照各自的对齐规则对齐,结构体整体的大小也会调整以满足最严格成员的对齐要求。 例如,一个结构体`struct stu`包括一个字符、一个整型和一个字符数组,如果在默认的4...

    struct必要包

    在结构体内,每个变量被称为成员,它们可以是任何基本数据类型,如整型、浮点型、字符型等。通过定义结构体,我们可以创建自定义的数据结构,这对于组织和管理复杂的数据非常有用。例如,我们可以定义一个名为 ...

    详解C语言Struct(结构体)系列之一

    在C99标准中,结构体内可以声明函数,这些函数的作用域限制在结构体内,相当于其他语言中的方法。此外,结构体还可以包含函数指针,这样的设计允许更灵活的数据和行为的组合。 五、空间换时间:结构体中成员变量的...

    C语言内存对齐.pdf

    编译器会根据成员变量的类型和对齐要求,在结构体内插入填充字节(padding bytes),以确保每个成员的起始地址都满足对齐要求。例如,在一个结构体中,如果一个short类型的成员后面紧跟着一个int类型的成员,编译器...

    不同的字节对齐下的申请的空间的比较源码

    - `number1`: 结构体内的成员按顺序分别为`int`(4字节)、`char`(1字节)、`short`(2字节)。由于编译器默认采用4字节对齐,所以`char b`之后会有3个填充字节以达到4字节的边界,而`short c`之后也会有一个填充字节以...

    自-网络传输struct类型数据 .docx

    这意味着结构体内的成员只能是C++的基本数据类型(如int, char, bool等)或这些基本类型的固定大小数组。例如,以下是一个符合这一约束的结构体示例: ```cpp typedef struct _tag_user_info_ { char cUserID[20]; ...

    C语言常见问题及规避和解决办法

    这是因为编译器通常会在结构体内添加填充以优化内存访问速度。如果需要准确的大小,可以使用前面提到的 `__attribute__((packed))`。 **2.12 如何确保...** 此处内容未完整提供,可以推测接下来的问题可能是关于...

    水滴石穿C语言之C语言的底层操作.doc

    尽管结构体内的成员顺序不同,但它们占用的总内存大小仍然是8字节,因为编译器进行了字节对齐以提高访问效率。 了解并熟练掌握这些底层操作,对于编写高效的C语言程序至关重要,特别是在系统级编程、嵌入式开发等...

    结构体内存对其计算结构体大小

    本文将深入探讨结构体内的内存对齐规则及其计算结构体大小的方法。 内存对齐的基本原则是,每个变量都存储在特定的地址边界上,这个边界通常是该变量类型的大小。例如,32位系统中,通常整型(int)变量会被对齐到4...

    C语言程序设计(第2版)-2期 经验技巧8-1 结构体变量的存储长度.pdf

    对于`test2`,`t1`被视为一个整体,对齐数为4(结构体内的最大成员`int i`的大小),因此`test2`的大小是20字节(4+12+4)。 至于空结构体,Visual C++中分配1字节大小,以便为变量提供一个地址,而GCC中则认为其...

    结构体大小计算

    当结构体内的成员也是另一个结构体时,计算其大小的方法与前面类似。需要注意的是,内嵌结构体的第一个成员的偏移量应为被嵌套结构体中的最大成员的有效对齐值的整数倍。 ##### 示例4 ```c struct stu5 { short i...

    定义嵌套结构体数组

    总结一下,定义嵌套结构体数组是创建复杂数据结构的一种方法,它允许我们在一个结构体内组合不同类型的变量,并且可以形成有层次的数据模型。在实际编程中,嵌套结构体数组广泛应用于各种场景,如数据库记录、文件...

Global site tag (gtag.js) - Google Analytics