`
Jia_er
  • 浏览: 10410 次
  • 性别: Icon_minigender_2
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

struct对齐问题

    博客分类:
  • C++
阅读更多

    struct(结构体)是一种复合数据类型,其构成元素既可以是如int、long这样的基本数据类型,也可以是一些复合数据类型,如struct等。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构体的地址相同。对于结构体,编译器会自动按其自然对齐条件分配空间。数据对齐方便了数据的查询,因为指针的偏移有一定的规律,但是这是以占有更多的内存空间为代价的。


1. 对齐

    指元素存放在内存中的起始地址偏移量(1,2,4,...)。例如int类型的偏移量应该是sizeof(int)。

 

2. struct自然对齐

 

  • 元素对齐 :按照元素类型的size进行。(个人理解,元素对齐亦即结构体内部的对齐方式。在结构体内部的连续空间,按类型的size寻址。)
  • 整体对齐 : 按照结构体中size最大元素进行。( 个人理解,整体对齐亦即结构体外部的对齐方式,相当于把结构体作为一种复杂数据类型来考虑,结构体所占内存是最大元素size的倍数。)

3.指定对齐

#pragma pack(num)

#pragma pack()             取消对齐

 

  • 元素对齐 :按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行;
  • 整体对齐 :按照结构体最大的数据成员和#pragma pack指定值之间,较小的那个进行。
4.struct的成员是struct
例如,struct A{
          struct B;
          }
对齐以B中最大元素长度为准,如示例里的NODE_D和NODE_E,因为NODE_C中最大元素size是4,所以NODE_D和NODE_E的大小均为16.


示例:

 

#include  <iostream>

using namespace std;

typedef struct
{
        int b;
        char c;
        short a;
        int d;
}NODE_A;

typedef struct
{
    char c;
    int b;
    short a;
    int d;
}NODE_B;


typedef struct
{
    int a;
    int b;
    char c;
}NODE_C;

typedef struct
{
    int a;
    NODE_C c;
}NODE_D;

typedef struct
{
    char a;
    NODE_C c;
}NODE_E;

int main(){

    cout << "sizeof(int) , sizeof(short), sizeof(char) : "
            << sizeof(int) << ", " << sizeof(short) << ", " << sizeof(char) << endl;

    cout << "sizeof(NODE_A) : " << sizeof( NODE_A ) << endl;
    cout << "sizeof(NODE_B) : " << sizeof( NODE_B ) << endl;
    cout << "sizeof(NODE_C) : " << sizeof( NODE_C ) << endl;
    cout << "sizeof(NODE_D) : " << sizeof( NODE_D) << endl;
    cout << "sizeof(NODE_E) : " << sizeof( NODE_E) << endl;

    /*
        Execution Result

        sizeof(int) , sizeof(short), sizeof(char) : 4, 2, 1
        sizeof(NODE_A) : 12
        sizeof(NODE_B) : 16
        sizeof(NODE_C) : 12
        sizeof(NODE_D) : 16
        sizeof(NODE_E) : 16

    */

    return 0;
}

分享到:
评论

相关推荐

    C/C++内存对齐.pdf

    介绍C/C++中内存对齐(字节对齐)的概念以及对齐规则。通过示例代码和图示帮助理解。

    struct和union计算方法

    2,对于struct,对齐的大小也是最大的基本元素的对齐大小,对象的大小需要考虑元素的对齐,并且需要是最大基本元素的整数倍;同时有#pragma pack修饰的情况,关于struct请详细参考另外一个帖子。 3,这里所说的...

    解析C语言中结构体struct的对齐问题

    首先看一下结构体对齐的三个概念值: 数据类型的默认对齐值(自身对齐): 1.基本数据类型:为指定平台上基本类型的长度。如在32位机器中,char对齐值为1,short为2,int,float为4,double为8; 结构体:其数据成员...

    C语言之struct大小、首地址与内存对齐[借鉴].pdf

    C语言之struct大小、首地址与内存对齐[借鉴].pdf

    pack-struct.md

    # 改变结构体成员的字节对齐 ## 例子 #include typedef struct { char a; int b; } ST_A;

    深入剖析C++中的struct结构体字节对齐

    要求数据内存的起始地址的值是某个数k的倍数,这就是所谓的内存对齐,本文就来深入剖析C++中的struct结构体字节对齐,需要的朋友可以参考下

    结构体字节对齐规则

    结构体字节对齐规则,主要是介绍结构体字节对齐规则,内容有点长,但是很全面.

    如何理解 struct 的内存对齐? - 知乎1

    前言:(10秒)前面的各位的方法很好,很传神,适合速成,想要速成还得看我这种小屁孩写的公式:(20秒)公式1:前面的地址必须是后面的地址正数倍,是就补齐公式2:

    内存对齐问题的完美解释.doc

    struct MyStruct { double dda1; char dda; int type }; 对结构MyStruct采用sizeof会出现什么结果呢?sizeof(MyStruct)为多少呢?也许你会这样求: sizeof(MyStruct)=sizeof(double)+sizeof(char)+...

    5分钟搞定内存字节对齐

    写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢?讲讲字节对齐吧.

    结构内存对齐StructMemory 配图示

    关于结构变量定义引起内存对齐的问题 配有图示

    c/c++中struct定义、声明、对齐方式解析

    一、定义/声明方式 第一种:仅有结构体名,不定义/声明变量 struct MyStruct { int i; char a[10]; double b;...第二种:有结构体名,并声明...//可同时定义,如struct MyStruct structName={7,“xxxxxxxxxx”,2.1};

    C++面试题之结构体内存对齐计算问题总结大全

    本文给大家介绍的是关于C++结构体内存对齐计算的相关内容,内存对齐计算可谓是笔试题的必考题,但是如何按照计算原则算出正确答案一开始也不是很容易的事,所以专门通过例子来复习下关于结构体内存对齐的计算问题。...

    C语言字节对齐详解

    介绍C语言字节对齐的文档,对C语言字节对齐讲述得很清楚,特别适合新手对结构体不清楚的情况下参考

    C语言、C++内存对齐问题详解

    主要介绍了C语言、C++内存对齐问题详解,内存对齐的问题主要存在于理解struct和union等复合结构在内存中的分布,需要的朋友可以参考下

    浅析C++字节对齐容易被忽略的两个问题

    在这里就分享两条开发中曾经忽略的问题:1、Union(联合体)的字节对齐先看代码:#pragma pack(4)struct com{ union { double dTest; int nTest; char szTest[14]; }; char chTest1; char chTest2;};#pragma...

    C/C++数据边界对齐的注意事项

     当建立一个struct或者class,必须考虑其成员变量的数据对齐,来尽可能减少空间的浪费,把占用空间小的元素放在struct/class的前面。例子: struct align {  double b;  char c;  int a; };  以上这...

Global site tag (gtag.js) - Google Analytics