c/c++内存对齐
发布日期:2021-10-10 05:31:26
浏览次数:39
分类:技术文章
本文共 1321 字,大约阅读时间需要 4 分钟。
内存对齐
文章目录
什么是内存对齐
首先,举个例子,大家看看如下的程序中的结构体应该占用多大的内存。
#includeusing namespace std;#pragma pack(1)typedef struct{ char a ; int b;}A;#pragma pack()typedef struct{ char a; int b;}B;int main(int argc, char ** argv){ cout << sizeof(A) << endl; cout << sizeof(B) << endl; return 0;}
大家有兴趣可以自己运行,没有采用强制对齐的结构体B的大小是8字节;
为何要进行内存对齐
尽管内存是以字节为单位,但是大部分处理器并不是按字节块来存取内存的.它一般会以双字节,四字节,8字节,16字节甚至32字节为单位来存取内存,我们将上述这些存取单位称为内存存取粒度。
测试不对齐访问与对齐访问的差异
#include#include #include #include #include #include using namespace std;long GetTime() { struct timeval tv; gettimeofday(&tv, NULL); long tt = tv.tv_sec * 1000 + tv.tv_usec / 1000 ; return tt;} int main(int argc, char ** argv){ char buf[512]; int tmp = 0; int count = 100000000; memset(buf, sizeof(buf), 0); long t1 = GetTime(); for (int i=0; i
然并卵,执行后是这样
use time : 42373use time : 43083use time : 42178use time : 43036
没看出差异,回头还得仔细分析下。
内存对齐规则
每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。gcc中默认#pragma pack(4),可以通过预编译命令#pragma pack(n),n = 1,2,4,8,16来改变这一系数。
有效对其值:是给定值#pragma pack(n)和结构体中最长数据类型长度中较小的那个。有效对齐值也叫对齐单位。
了解了上面的概念后,我们现在可以来看看内存对齐需要遵循的规则:
-
结构体第一个成员的偏移量(offset)为0,以后每个成员相对于结构体首地址的 offset 都是该成员大小与有效对齐值中较小那个的整数倍,如有需要编译器会在成员之间加上填充字节。
-
结构体的总大小为 有效对齐值 的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
转载地址:https://blog.csdn.net/qq_22054285/article/details/87875586 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2024年04月09日 05时57分10秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Http 持久连接与 HttpClient 连接池
2019-04-28
Spring Boot 自动配置的 “魔法” 是如何实现的?
2019-04-28
接口方法上的注解无法被@Aspect声明的切面拦截的原因分析
2019-04-28
Mybatis 使用的 9 种设计模式,真是太有用了
2019-04-28
TCP为什么是三次握手和四次挥手
2019-04-28
web.xml 组件加载顺序
2019-04-28
关于Spring底层原理面试的那些问题,你是不是真的懂Spring?
2019-04-28
LVS三种模式的区别及负载均衡算法
2019-04-28
BATJ面试必会|Jvm 虚拟机篇
2019-04-28
Java进阶学习路线
2019-04-28
springboot整合spring @Cache和Redis
2019-04-28
全文搜索!收藏这篇Solr ElasticSearch 长文就可以搞定
2019-04-28
select count(*)底层究竟干了啥么?
2019-04-28
为什么不应该重写service方法
2019-04-28
Spring MVC竟然有5种参数绑定的方式?你知道几种?
2019-04-28
MySQL - InnoDB特性 - Buffer Pool漫谈
2019-04-28
五分钟轻松了解Hbase面向列的存储
2019-04-28
十分钟理解负载均衡
2019-04-28
MYSQL性能优化的最佳20+条经验
2019-04-28