博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c语言的内存对齐问题
阅读量:2140 次
发布时间:2019-04-30

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

内存对齐的目的:

       字,双字,和四字在自然边界上不需要在内存中对齐。(对字,双字,和四字来说,自然边界分别是偶数地址,可以被 4 整除的地址,和可以被 8 整除的地址。)无论如何,为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。一个字或双字操作数跨越了 4 字节边界,或者一个四字操作数跨越了 8 字节边界,被认为是未对齐的,从而需要两次总线周期来访问内存。一个字起始地址是奇数但却没有跨越字边界被认为是对齐的,能够在一个总线周期中被访问。

使用指令#pragma pack (n),编译器将按照 n 个字节对齐。
使用指令#pragma pack (),编译器将取消自定义字节对齐方式。3

 

 

 

#include <stdio.h>

typedef  struct TestStruct1
{
char c1;
short s;
char c2;
int i;
};
 
int main(int argc, char * argv[])
{
 struct TestStruct1 a;
printf("c1 %p,s  %p,c2  %p,i  %p\n",
(unsigned int)&a.c1 - (unsigned int) &a,     //(void *) means force transform to type of pointer .
(unsigned int)(void*)&a.s - (unsigned int)(void*)&a,   
(unsigned int)(void*)&a.c2 - (unsigned int)(void*)&a,
(unsigned int)(void*)&a.i - (unsigned int)(void*)&a);
printf("size of short is %d\n",sizeof(  short));   //   2
printf("size of TestStruct1 is %d\n",sizeof(   TestStruct1  ));   //12
    return 0;
}
 /*end of run!!!

c1 00000000,s  00000002,c2  00000004,i  00000008

size of short is 2
size of TestStruct1 is 12.

*/
 

所以由此可得在内存中按4字节对齐
 

转载地址:http://jdtgf.baihongyu.com/

你可能感兴趣的文章
Go语言学习Part1:包、变量和函数
查看>>
Go语言学习Part2:流程控制语句:for、if、else、switch 和 defer
查看>>
Go语言学习Part3:struct、slice和映射
查看>>
Go语言学习Part4-1:方法和接口
查看>>
Leetcode Go 《精选TOP面试题》20200628 69.x的平方根
查看>>
Leetcode C++ 剑指 Offer 09. 用两个栈实现队列
查看>>
Leetcode C++《每日一题》20200707 112. 路径总和
查看>>
云原生 第十一章 应用健康
查看>>
Leetcode C++ 《第202场周赛》
查看>>
云原生 第十二章 可观测性:监控与日志
查看>>
Leetcode C++ 《第203场周赛》
查看>>
云原生 第十三章 Kubernetes网络概念及策略控制
查看>>
《redis设计与实现》 第一部分:数据结构与对象 || 读书笔记
查看>>
《redis设计与实现》 第二部分(第9-11章):单机数据库的实现
查看>>
算法工程师 面经2019年5月
查看>>
搜索架构师 一面面经2019年6月
查看>>
稻草人手记
查看>>
第一次kaggle比赛 回顾篇
查看>>
leetcode 50. Pow(x, n)
查看>>
leetcode 130. Surrounded Regions
查看>>