博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于字节对齐的sizeof的讨论
阅读量:4957 次
发布时间:2019-06-12

本文共 1137 字,大约阅读时间需要 3 分钟。

众所周知,程序为了提高访问效率,编译器在编译的时候,进行字节对齐。程序员也可以字节指定对齐方式。

Win32下的为progma指令,具体来说

 
#pragma
pack(push)
//
保存原对齐状态
#pragma
pack(4)
//
设定为4字节对齐
struct
test
{
int
a;
};
#pragma
pack(pop)
//
恢复对齐状态

在linux下,gcc是默认的编译器。g++ 支持progma指令,gcc也支持GNU扩展__attribute__指令

参考,对于字节对齐的举例为

 
struct
test{
short
b[
3
];
} __attribute__ ((aligned (
8
)));

__attribute__还支持aligned 和 packed ,解释如下

 
__attribute__ ((aligned)); 选择针对目标机器最大的对齐方式,可以提高拷贝操作的效率。
aligned属性使被设置的对象占用更多的空间,相反的,使用packed可以减小对象占用的空间。
需要注意的是,attribute属性的效力与你的连接器也有关,如果你的连接器最大只支持16字节对齐,
那么你此时定义32字节对齐也是无济于事的。
__attribute__ ((packed))使用该属性可以使得变量或者结构体成员使用最小的对齐方式,即对变量是一字节对齐,
对域(field)是位对齐。

下面以pragma 来讨论指定结构体对齐方式!

总的来说规律如下

 
#pragma
pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:
第一、如果n大于等于该变量所占用的字节数,那么偏 移量必须满足默认的对齐方式
第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。
结构的总大小也有个约束条 件,分下面两种情况:
如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;
否则必须为n的倍数。
alignment (n) must be a small power of two

示例

 
struct
test
{
char
m1;
double
m4;
int
m3;
};

如果不指定对齐方式的话,其以double所占空间大小对齐,即

sizeof(struct test) = 24 (IA32 GCC)

此处让我想起linux中的container_of,和offset宏。

转载于:https://www.cnblogs.com/westfly/archive/2011/07/06/2099588.html

你可能感兴趣的文章
Boosting(提升方法)之AdaBoost
查看>>
链接元素<a>
查看>>
Binding object to winForm controller through VS2010 Designer(通过VS2010设计器将对象绑定到winForm控件上)...
查看>>
Spring Boot实战笔记(二)-- Spring常用配置(Scope、Spring EL和资源调用)
查看>>
第二章:webdriver 控制浏览器窗口大小
查看>>
【动态规划】流水作业调度问题与Johnson法则
查看>>
Python&Selenium&Unittest&BeautifuReport 自动化测试并生成HTML自动化测试报告
查看>>
活现被翻转生命
查看>>
POJ 1228
查看>>
SwaggerUI+SpringMVC——构建RestFul API的可视化界面
查看>>
springmvc怎么在启动时自己执行一个线程
查看>>
流操作的规律
查看>>
Python基础学习15--异常的分类与处理
查看>>
javascript运算符的优先级
查看>>
React + Redux 入门(一):抛开 React 学 Redux
查看>>
13位时间戳和时间格式化转换,工具类
查看>>
vue router-link子级返回父级页面
查看>>
C# 通知机制 IObserver<T> 和 IObservable<T>
查看>>
Code of Conduct by jsFoundation
查看>>
div 只显示两行超出部分隐藏
查看>>