zoukankan      html  css  js  c++  java
  • 关于C语言 内存对齐的问题

    C语言也和扑克牌一样, 易学难精。 对于 内存对齐的问题, 一直知道有这样的事实存在,却没有真的理解过如何来的 。

    百度百科里给 内存对齐的原因作了一定的阐述: 

      1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

      2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

    下面开始对内存对齐的进行具体认识。(演示于VS2010, 以结构体为例)

    在VS2010里, 默认情况下,编译器会对内存进行自动对齐(以最高性能方式对齐)。

    struct Test1

    {

      char a;

      char b;

      int c;

      int d;

    };这时sizeof(struct Test1) == 12;

    struct Test2

    {

      char a;

      char b;

      double c;

      double d;

    };这时sizeof(struct Test2) == 24;

    但如果在程序段中加入一下代码,就可以自定义内存对齐

    #pragma pack(n)//编译器将按照n字节对齐,n为整数,

    #pragma pack()//编译器将取消自定义对齐。

    同样是上面两个结构体,如果分别依次在前面加上#pragma pack(1)、#pragma pack(4)和#pragma pack(8)时,那么结果会是

    10和18;12和20;12和24

    NOTE:虽然指定了n字节对齐,但不是所有成员都以n字节对齐,而是按照成员类型与中较小的那个进行对齐。

    PS:所谓的对齐的意思就是 offset%n = 0 (offset为偏移地址,n为上述两者较小的数)

  • 相关阅读:
    渗透测试工具sqlmap基础教程
    安全测试——利用Burpsuite密码爆破(Intruder入侵)
    什么是AWVS
    渗透测试工具sqlmap基础教程
    安全测试——利用Burpsuite密码爆破(Intruder入侵)
    AWVS基本用法
    scrapy爬虫框架教程(二)-- 爬取豆瓣电影
    全链路压测平台在美团中的实践
    全链路压测平台在美团中的实践
    bzoj 1934: [Shoi2007]Vote 善意的投票
  • 原文地址:https://www.cnblogs.com/vedgtar/p/2167823.html
Copyright © 2011-2022 走看看