(C)字节对齐#pragma pack()
1. 为什么要进行对齐
对于结构体,编译器会自动进行成员变量对齐处理,是为了提高运算效率。
缺省情况下是自然对齐方式。
2. 自然对齐
即默认对齐,按照结构体的成员中size最大的成员进行对齐。
例:
struct naturalalign
{
char a;
short b
int c;
};
上述结构体,成员size最大的是c,sizeof(c)为4,因此,结构体中的成员都以4为单位进行对齐,sizeof(naturalalign)为12.
3. 指定对齐
即按照指定的字节大小进行对齐。
使用伪指令:
#pragma pack(N); //按照N个字节进行对齐
#pragma pack();//取消指定对齐
注:
如果N大于结构体中最大成员的size,则不起作用。仍然以默认方式对齐。
例:
#pragma pack(N)
struct natural
{
char a;
int b;
char c;
};
#pragma pack();
当N分别为4,8,16时,其对齐方式是一样的。sizeof(natural)都为12;
当N为2时,sizeof(natural)为6.
4. Intel1.微软面试题
#pragma pack(8)
struct example1
{
short a;
long b;
};
struct example2
{
char c;
example1 struct1;
short e;
};
#pragma pack();
int main(int argc,char*argv[])
{
example2 struct2;
cout<<sizeof(example1)<<endl;
cout<<sizeof(example2)<<endl;
cout<<(unsigned int)(&struct2.struct1) - (unsigned int)(&struct2)<<endl;
return 0;
}
问:程序输出结果?
分析:
struct example1中成员最大size为4,故指定对齐8不起作用。
sizeof(example1) = 4*2 = 8;
struct example2中包含struct example1,其本身成员最大size为2,而example1中的成员最大size为4,指定对齐8也不起作用。,
sizeof ( example2 ) = 4*4 = 16;
由于struct example2中成员以4为单位对界,因此,char变量c后应该补充3个bit,后面才是struct1的地址,故最后输出结果为4.
(C)字节对齐#pragma pack()的更多相关文章
- 字节对齐#pragma pack
这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n) 作用:C编译器将按照n个字节对 ...
- pragma pack,字节对齐
关于字节对齐 pragma pack 一. 测试代码: // packTest.cpp : Defines the entry point for the console application. / ...
- #pragma pack(n)对齐格式
#pragma pack(n)对齐格式 #pragma pack(n) 是预处理器用来指定对齐格式的指令,表示n对齐.当元素字节小于n时,要扩展到n:若元素字节大于n则占用其实际大小. struct ...
- #pragma pack(push,1)与#pragma pack(1)的区别
这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n) 作用:C编译器将按照n个字节对 ...
- (转载)关于#pragma pack(push,1)和#pragma pack(1)
转载http://www.rosoo.net/a/201203/15889.html 一.#pragma pack(push,1)与#pragma pack(1)的区别 这是给编译器用的参数设置,有关 ...
- #pragma pack(push,1)与#pragma pack(pop)
这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n) 作用:C编译器将按照n个字节对 ...
- c编译器字节对齐指令
#pragma pack (n) 作用:C编译器将按照n个字节对齐.#pragma pack () 作用:取消自定义字节对齐方式. #pragma ...
- C++字节对齐与位域
环境: win7_x64旗舰版.VS2015企业版 一.字节对齐: 说明:为了提高 CPU 的存储速度,编译器会对 struct 和 union的存储进行优化,即进行字节对齐. 1. 指定对齐参数值: ...
- 【转】#pragma pack(push,1)与#pragma pack(1)的区别
这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n) 作用:C编译器将按照n个字节对 ...
随机推荐
- 【DFS序+树状数组】BNUOJ 52733 Random Numbers
http://acm.bnu.edu.cn/v3/problem_show.php?pid=52733 [题意] 给定一棵树,这棵树每个点都有一个点权,标号从0开始,0是根结点 修改操作: SEED ...
- #ifdef endif 用法
"#ifdef 语句1 程序2 #endif“ 可翻译为:如果宏定义了语句1则程序2. 作用:我们可以用它区隔一些与特定头文件.程序库和其他文件版本有关的代码. 代码举例:新建define. ...
- POJ 2185 Milking Grid [二维KMP next数组]
传送门 直接转田神的了: Milking Grid Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 6665 Accept ...
- Codeforces Round #265 (Div. 2) C 暴力+ 找规律+ 贪心
C. No to Palindromes! time limit per test 1 second memory limit per test 256 megabytes input standar ...
- MySQL实现了四种通信协议
原文链接:http://blog.csdn.net/yangling132/article/details/50932705[侵删] TCP/IP协议,通常我们通过来连接MySQL,各种主要编程语言都 ...
- grafana 安装 和 Nginx 、EL 联调
https://blog.csdn.net/u010735147/article/details/80943593
- AC日记——[USACO1.1]坏掉的项链Broken Necklace 洛谷 P1203
题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...
- 存code
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> us ...
- 利用systemtap定位ifconfig dropped数据包的原因
http://blog.chinaunix.net/uid-20662820-id-3842431.html 欢迎转载,转载请保留文章的完整性!Author: Tony <tingw.liu ...
- axis2调用WSDL接口
public static JSONObject sendWsdl(String url,String xmlStr){ JSONObject res=new JSONObject(); try { ...