(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个字节对 ...
随机推荐
- css3鼠标点击穿透--摘抄
有些时候网页中用到了一些绝对定位的Div,因为需要事先这个Div是隐藏的,但是它所在的位置会遮挡住鼠标点击事件.这个时候可以用CCS3中的pointer-events属性来解决. //穿透该层 p ...
- Oracle命令行创建数据库
创建数据库文件 CREATE TABLESPACE MyDataBase LOGGING DATAFILE 'D:\Oracle\database\MyDataBase.dbf' SIZE 100M ...
- 10款GitHub上最火爆的国产开源项目
衡量一个开源产品好不好,看看产品在 GitHub 的 Star 数量就知道了.由此可见,GitHub 已经沦落为开源产品的“大众点评”了.一个开源产品希望快速的被开发者知道.快速的获取反馈,放到 Gi ...
- 真的了解CDN服务吗?
Im CDN,WOW,COOL CDN知识详解 全称:Content Delivery Network或Content Ddistribute Network,即内容分发网络,CDN是构建在网络之上的 ...
- Codeforces 735 E Ostap and Tree
Discription Ostap already settled down in Rio de Janiero suburb and started to grow a tree in his ga ...
- php 解决MySQL插入数据出现 Incorrect string value: '\xF0\x9F\x92\x8BTi...'错误
在项目中向MySQL插入数据时.发现数据插入不完整,通过调试,发现插入语句也没什么特殊的错误. 可是就是差不进去,于是就打开mysqli错误的调试 $ret = mysqli_query($this- ...
- 安装ftp服务器
Linux安装ftp组件 1 安装vsftpd组件 安装完后,有/etc/vsftpd/vsftpd.conf文件,是vsftp的配置文件. [root@bogon ~]# yum -y insta ...
- BUPT复试专题—复数集合(?)
https://www.nowcoder.com/practice/abdd24fa839c414a9b83aa9c4ecd05cc?tpId=67&tqId=29643&rp=0&a ...
- iOS类的合理设计,面向对象思想
每天更新的东西可能有反复的内容.当时每一部分的知识点是不同的,须要大家认真阅读 这里介绍了iOS类的合理设计.面向对象思想 main.m #import <Foundation/Foundati ...
- Version和Build的差别
[1]概念 iOS的版本号号.一个叫做Version,一个叫做Build,这两个值都能够在Xcode 中选中target,点击"Summary"后看到. Version在plist ...