当前位置:  编程技术>c/c++/嵌入式

VC++中内存对齐实例教程

    来源: 互联网  发布时间:2014-10-27

    本文导语:  内存对其是VC++程序设计中一个非常重要的技巧,本文即以实例讲述VC++实现内存对其的方法。具体分析如下: 一、概述 我们经常看到求 sizeof(A) 的值的问题,其中A是一个结构体,类,或者联合体。 为了优化CPU访问和优化内存...

内存对其是VC++程序设计中一个非常重要的技巧,本文即以实例讲述VC++实现内存对其的方法。具体分析如下:

一、概述

我们经常看到求 sizeof(A) 的值的问题,其中A是一个结构体,类,或者联合体。

为了优化CPU访问和优化内存,减少内存碎片,编译器对内存对齐制定了一些规则。但是,不同的编译器可能有不同的实现,本文只针对VC++编译器,这里使用的IDE是VS2012。

#pragma pack()是一个预处理,表示内存对齐。布局控制#pragma,为编译程序提供非常规的控制流信息。

二、结构体的大小的规则

结构体大小是处理器位数和结构体内最长数据元素所占字节数二者中较小的那一个的整数倍。

比如说,假设处理器位数为n,结构体内最大数据元素所占字节数为m。

处理器为32位,n = 4;结构体内最大数据类型为short,m = 2; n > m;结构体大小为m的整数倍,反之亦然。

注意:有些虽然是64位的操作系统,但是编译器却是32位的,此时位数为32.

class A{
   int a;
   char b;
   short c;
};
sizeof(A)为8,为4的整数倍。

struct B{
   short a;
   short b;
   short c;
};

sizeof(B)为6,为2(sizeof(short))的整数倍。

注意:C++中的结构体与类只有一个区别,就是结构体成员默认是public,而类默认是private。

class X{
public:
  double a;
  float b;
  int c;
  char d;
};

sizeof(X)为20,为4(处理器位数)的整数倍。

三、#pragma pack(n)

#pragma pack(n)中的n默认是4,即处理器位数32,但我们可以自己定义它的大小。

#pragma pack(1)
class A{
public:
  int a;
  char b;
  short c;
};

此时sizeof(A)为7,为1(#pragma pack(1))的整数倍。

#pragma pack(1)
  class X{
  public:
    double a;
    int b;
    short c;
    char d;
  };

sizeof(X)为15,为1(#pragma pack(1))的整数倍。

#pragma pack(4)
  class X{
  public:
    double a;
    int b;
    short c;
    char d;
  };

sizeof(X)为16,为4(#pragma pack(4))的整数倍。

#pragma pack(8)
  class X{
  public:
    double a;
    int b;
    short c;
    char d;
  };

sizeof(X)为16,为8(#pragma pack(8) 或者 sizeof(double))的整数倍。

四、内存对齐

结构体中数据元素所在内存地址由两个因素决定。

一是#pragma pack(n) 中的n,二是元素类型所占字节数,sizeof(type),两者中取较小的一个,元素内存地址到结构体或类的起始地址的偏移量为较小数的整数倍。

比如#pragma pack(n)默认为4,有以下结构体

struct A{
  int a;
  char b;
  short c;
};

a的起始地址距离结构体起始地址的偏移量为0,是sizeof(int)的整数倍。

b的起始地址距离结构体起始地址的偏移量为4,是sizeof(char)的整数倍。

c的起始地址距离结构体起始地址的偏移量为5,不是sizeof(short)的整数倍,所以它的起始地址偏移量将会是6,而不是5。

输出a, b, c 的地址为

0043FD68

0043FD6C

0043FD6E

可以看到c的起始地址比b的起始地址大了2个字节,b占了2个字节的大小,这是因为c的类型是short型,大小为2,而n默认是4,sizeof(short) < n,所以偏移量应该是2的整数倍,这里是6.

希望本文所述对大家的VC++程序设计有所帮助。


    
 
 

您可能感兴趣的文章:

  • unix下内存边界对齐问题!
  • unix下,如何使得结构按1字节进行内存对齐?
  • struct 结构内存对齐问题.
  • 内存对齐的问题,会的请进
  • 教你5分钟轻松搞定内存字节对齐
  • 求助:unix下内存对齐问题的解决
  • 内存对齐的问题
  • 浅析内存对齐与ANSI C中struct型数据的内存布局
  • 深入内存对齐的详解
  • 深入理解c/c++ 内存对齐
  • C语言内存对齐实例详解
  • C语言、C++内存对齐问题详解
  • 关于C++内存中字节对齐问题的详细介绍
  • 深入理解C语言内存对齐
  • 解析内存对齐 Data alignment: Straighten up and fly right的详解
  • C++里能不能在指定的一块内存中创建对象的实例?
  • Linux操作系统下Oracle数据库多实例启动方式及修改内存
  • C#中string和StingBuilder内存中的区别实例分析
  • C语言创建链表错误之通过指针参数申请动态内存实例分析
  • Python使用稀疏矩阵节省内存实例
  • C++内存查找实例
  • Android加载大分辨率图片到手机内存中的实例方法
  • win32下进程间通信(共享内存)实例分析
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • android开发教程之用命令启动android模拟器并设置其内存大小
  • C++ Vectors 成员 get_allocator():返回vector的内存分配器
  • 我的机器内存128 ,安装redhat9 后,可用内存很少了,如何节省内存呢?
  • C++ Vectors 成员 capacity():返回vector所能容纳的元素数量(在不重新分配内存的情况下)
  • 奇闻:Apache+Apache JServ 1.1.1+1G内存居然报内存不够,那位高友知道参数设置,把俺的1G内存都利用起来,感激不尽啊
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍
  • 怎样读取指定内存地址处指定长度的内存数据???(
  • C/C++内存池实现介绍及基本要求
  • 【操作系统虚拟内存和物理内存疑惑】
  • linux下free命令显示的内存使用情况分析
  • 请教一个关于内存分配的问题(系统和DMA共享一块物理内存空间)
  • c/c++内存堆分配和栈分配理解
  • Solaris下如何获得物理内存和虚拟内存的大小?
  • Ubuntu查看内存,进程相关命令介绍
  • 程序需要共享内存相当大,但是系统的内存有限
  • Linux 共享内存介绍及实现代码
  • 关于大于2G内存的使用.....按32位编译的进程怎么使用大于2G的内存?
  • Linux内存文件系统(ramdisk)的三种实现方式
  • redhat9内存使用率高达73%,怎么查看内存具体使用情况
  • Microsoft IE MSHTML内存破坏远程代码执行漏洞
  • 遇到奇怪的内存泄露问题,应用程序杀死内存无法释放!
  • Microsoft Internet Explorer内存破坏漏洞(CNVD-2013-13096)
  • 多个进程对系统V共享内存进行读写,怎样实现对共享内存部分进行加解锁?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3