对struct数据对齐与#pragma pack(n)的理解一直存在误区,这里做一个总结,便于以后记忆。
规则主要有两条:
1.结构,联合或者类的数据成员,第一个放在偏移为0的地方,以后每一个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员的自身长度来定,取较小的那个。
2.对于整体结构的对齐,则按照结构体中最大数据成员和#pragma pack的大小来定,去较小的那个。
以下是测试代码:
#include<iostream>
using namespace std;
struct test
{
short a;
short b;
int c;
char d;
};
#pragma pack(4)
struct test2
{
char a;
short b;
char c;
};
#pragma pack()
struct s1
{
short a;
long b;
};
struct s2
{
char c;
s1 d;
long long e;
};
#pragma pack(4)
struct s3
{
int a;
char b;
short c;
char d;
};
struct s4
{
char a;
short b;
char c;
};
#pragma pack()
#pragma pack(2)
struct s5
{
int a;
char b;
short c;
char d;
};
#pragma pack()
int main()
{
cout<<sizeof(test)<<endl;
cout<<sizeof(test2)<<endl;
cout<<sizeof(s1)<<endl;
cout<<sizeof(s2)<<endl;
cout<<sizeof(s3)<<endl;
cout<<sizeof(s4)<<endl;
cout<<sizeof(s5)<<endl;
unsigned int ccc;
cout<<sizeof(ccc)<<endl;
}
分享到:
相关推荐
#pragma pack(n) (n=1/2/4/8):按n字节对齐 #pragma pack(2) struct mystruct1 { int a; char b; short c; } struct mystruct2 { int a;; double b; short c; } #pragma pack() 以上这部分内容是...
同时有#pragma pack修饰的情况,关于struct请详细参考另外一个帖子。 3,这里所说的struct和union的对齐,是指其作为其他复杂对象中的元素的时候要求的对齐,对于本身大小的计算并没有关系。本身的大小只和其所包含...
当未用 #pragma 指令指定编译器的对齐位数时,结构体按最长宽度的数据成员的宽度对齐;当使用了 #pragma 指令指定编译器的对齐位数时,结构体按最长宽度的数据成员的宽度和 #pragma 指令指定的位数中的较小值对齐。 ...
2.指定对齐值:#pragma pack (value)时的指定对齐值value。 3.数据类型的有效对齐值:默认对齐值和指定对齐值中小的那个值。 有了这些值,我们就可以很方便的来讨论具体数据结构的成员和其自身的对齐方式。有效对齐...
在这里就分享两条开发中曾经忽略的问题:1、Union(联合体)的字节对齐先看代码:#pragma pack(4)struct com{ union { double dTest; int nTest; char szTest[14]; }; char chTest1; char chTest2;};#pragma...
原则1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。...
sizeof计算struct大小(转) [ 分类: Linux ] 由 弗里曼•潘 发表于 11:23 pm 评论( 0 ) 题目:s的输出结果 #include struct s { char ch, *ptr;...还有利用#pragma pack设置对齐方式是怎么回事? 字串9
Q:关于结构体的对齐,到底遵循什么原则? A:首先先不讨论结构体按多少字节对齐,先看看只以1字节对齐的情况: #include #include ...#pragma pack(1) typedef struct { char sex; short score;
c++ 中__declspec 的用法如下,想要了解的继续往下看吧。...它与#pragma pack()是一对兄弟,前者规定了对齐的最小值,后者规定了对齐的最大值。同时出现时,前者优先级高。 __declspec(align())的一个特点是,它仅仅规
例如,下面的结构各成员空间分配情况(假设对齐方式大于2字节,即#pragma pack(n), n = 2,4,8…下文将讨论#pragmapack()): 代码如下:struct test { char x1; short x2; float x3; char x4;}; 结构的第一个成员...
#pragma pack(1) 求: 结构体struct node_t中成员变量c的偏移。 注:这里的偏移量指的是相对于结构体起始位置的偏移量。 看到这个问题的时候,我相信不同的人脑中浮现的解决方法可能会有所差异,下面我们分析以下几...
struct X { unsigned char s1:2; unsigned char s2:3; unsigned char s3:3; } x; unsigned char c; } v; v.c = 100; printf("%d", v.x.s3); } 3 --------------------------------------------------...
#pragma pack (1) struct ethernet_head { unsigned char dest_mac[6]; //目标主机MAC地址 unsigned char source_mac[6]; //源端MAC地址 unsigned short eh_type; //以太网类型 }; struct arp_head { ...
#pragma pack(2) typedef struct { unsigned short bfType; // 文件类型 unsigned long bfSize; // 文件大小 unsigned short bfReserved1; // 保留位 unsigned short bfReserved2; // 保留位 unsigned long ...
3.6.8,#pragma pack.............................................. 69 3.6.8.1,为什么会有内存对齐?................. 70 3.6.8.2,如何避免内存对齐的影响............. 70 3.7, #运算符..........72 3.8,##...
1.4.1,数据类型与“模子”............................................................................................... 14 1.4.2,变量的命名规则..........................................................
1.4.1,数据类型与“模子”............................................................................................... 14 1.4.2,变量的命名规则..........................................................
1.4.1,数据类型与“模子”............................................................................................... 14 1.4.2,变量的命名规则..........................................................