博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内存对齐
阅读量:4589 次
发布时间:2019-06-09

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

C中如下结构:

struct foo { char c1; short s; char c2; int i; }; 

假设结构成员在内存中紧凑排列,c1地址0s地址应该是1c2地址3i地址4
c1 00000000
s 00000001
c2 00000003
i 00000004

VC6 

#include<stdio.h>

Struct  foo { char c1; short s; char c2; int i; }; 

int main()

 { struct foo a;

 printf("c1\t%p\ns\t%p\nc2\t%p\ni\t%p\n", (unsigned int)(void*)&a.c1 - (unsigned int)(void*)&a, (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("sizeof(foo)=%d\n",sizeof(foo)); return 0;

 } 

c1 00000000

s 00000002
c2 00000004
i 00000008

这就是内存对齐而导致的问题

为什么会有内存对齐

以下内容节选自《Intel Architecture 32 Manual》。

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

    如果不在编码时指定内存对齐方式,由于不同平台有不同的默认对齐方式从而造成通讯时不同平台数据通信数据处理问题,需要注意

转载于:https://www.cnblogs.com/totem1990/archive/2012/09/08/2677117.html

你可能感兴趣的文章
[SAP FI-AP]自動支払(tr-cd:F110)に関係するテーブル
查看>>
Visual Studio 2013 中 mysql 使用 EF6
查看>>
mybatis批量更新报错badsql
查看>>
php setcooike()失败的原因之一,希望能帮到你
查看>>
sublime
查看>>
Oracle Audit 审计功能的认识与使用
查看>>
从不同的角度分析Flex的优缺点
查看>>
【RabbitMQ】消息队列RabbitMQ与Spring集成
查看>>
图片加载机制比较
查看>>
Python scrapy爬取带验证码的列表数据
查看>>
MySQL数据库免安装版配置
查看>>
你必知必会的SQL面试题
查看>>
print输出带颜色
查看>>
GIT版本控制工具使用
查看>>
logback的使用和logback.xml详解
查看>>
做一个小总结吧,把别人的经验拿来总结一下
查看>>
CMake系列之一:概念
查看>>
html5 Canvas绘制时钟以及绘制运动的圆
查看>>
Unity3D热更新之LuaFramework篇[05]--Lua脚本调用c#以及如何在Lua中使用Dotween
查看>>
JavaScript空判断
查看>>