首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
其他好文
> 详细
字节对齐
时间:
2015-01-28 19:50:44
阅读:
164
评论:
0
收藏:
0
[点我收藏+]
标签:
字节对齐
malloc
aligned
结构体大小
字节对齐
1. X86结构是小端模式存储,既数据低位在低存储地址,数据高位在高存储地址。例如 short x = 0x3344; 假设x的地址为 0xBFFFF0F4,那么0xBFFFF0F4地址里面存储的是字节0x44, 0xBFFFF0F5地址里面存储的是字节0x33.
2. 为了使CPU能够跟快的访问内存,变量地址和变量长度有关联,即所谓地址对齐。4字节的int类型变量,其起始地址应位于4字节边界上,
即起始地址能够被4整除,也就是地址低2位为0. N字节对齐就满足:address &(N-1)== 0。N为2,4,8,16等2的幂次。讨论3字节对齐,5字节对齐没有什么意义;
3. 结构体内变量存储空间,需要看整个结构体内最大变量长度,及各个变量的位置。
struct {
char a;
short b;
char c;
}s1;
sizeof(s1) = 6
aa 00 | bb bb | cc 00
struct {
char a;
char c;
short b;
}s2;
sizeof(s2) = 4
aa cc | bb bb
struct {
char a;
int b;
char c;
}s3;
sizeof(s3) = 12
aa 00 00 00| bb bb bb bb| cc 00 00 00 00
struct {
char a;
char c;
int b;
}s4;
sizeof(s4) = 8
aa cc 00 00 | bb bb bb bb
// 申请align_size字节对齐的存储空间
void *aligned_malloc(int size, int align_size) {
// 可以多申请align_size个字节。其中align_size-1字节用来调整对齐,1字节用来记录和实际分配的起始地址的偏差值。
void *tempPtr = malloc(size + align_size); // tempPtr是实际分配地址
char offset = align_size - ((int)tempPtr % align_size); // 和实际分配地址的偏差值,范围是 [1, align_size]
char *alignedPtr = (char*)tempPtr + offset; // tempPtr + offset得到align_size字节对齐的地址空间
alignedPtr[-1] = offset; // 记录偏移值在前一个地址字节上
return (void*)alignedPtr;
}
// 释放aligned_malloc函数申请到的存储空间
void aligned_free(void *ptr) {
char offset = ((char*)ptr)[-1]; // 得到和实际分配地址的偏差值
free((char*)ptr - offset); // 得到实际地址
}
0xzz zz zz zz ... oo vv vv vv ... vv
| | |
tmpPtr | alignedPtr,函数返回值
存储offset
char *alignedPtr = (char*)tempPtr + offset;
char *tempPtr = (char *)alignedPtr - offset;
字节对齐
标签:
字节对齐
malloc
aligned
结构体大小
原文地址:http://blog.csdn.net/huibailingyu/article/details/43234723
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
分布式事务
2021-07-29
OpenStack云平台命令行登录账户
2021-07-29
getLastRowNum()与getLastCellNum()/getPhysicalNumberOfRows()与getPhysicalNumberOfCells()
2021-07-29
【K8s概念】CSI 卷克隆
2021-07-29
vue3.0使用ant-design-vue进行按需加载原来这么简单
2021-07-29
stack栈
2021-07-29
抽奖动画 - 大转盘抽奖
2021-07-29
PPT写作技巧
2021-07-29
003-核心技术-IO模型-NIO-基于NIO群聊示例
2021-07-29
Bootstrap组件2
2021-07-29
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!