zoukankan      html  css  js  c++  java
  • 内存对齐

    对齐原因

    为了访问未对齐的内存,处理器需要做两次内存访问。而对齐的内存只需做一次内存访问。 一个字或双字操作数跨越了4 字节边界,或者一个四字操作数跨越了8 字节边界,被认为是未对齐的,从而需要两次总线周期来访问内存。一个字起始地址是奇数但却没有跨越字边界被认为是对齐的,能够在一个总线周期中被访问。某些操作双四字的指令需要内存操作数在自然边界上对齐。如果操作数没有对齐,这些指令将会产生一个通用保护异常。双四字的自然边界是 能够被16 整除的地址。其他的操作双四字的指令允许未对齐的访问(不会产生通用保护异常),然而,需要额外的内存总线周期来访问内存中未对齐的数据。

    对齐原则

    • 但是不论类型是什么,对齐的边界一定是1,2,4,8,16,32,64…中的一个。
    • 每个成员分别按自己的方式对齐,并能最小化长度。
    • 复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度。然后,对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐。
    • 自定义对齐边界时:每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是n 字节)中较小的一个对齐

    编译器对齐

    缺省情况下,编译器默认将结构、栈中的成员数据进行内存对齐。

    自定义对齐

    #pragma pack 的用法:
    #pragma pack(push) //保存当前对齐方式到packing stack
    #pragma pack(push,n) 等效于
    #pragma pack(push)
    #pragma pack(n) //n=1,2,4,8,16 保存当前对齐方式,设置按n 字节对齐。
    #pragma pack(pop) //packing stack 出栈,并将对其方式设置为出栈的对齐。
    
  • 相关阅读:
    angular 中如何使用自定义组件
    angular组件数据和事件
    angular组件数据
    angular绑定数据
    angular自定义组件
    angular项目目录结构分析
    Angular 开发工具介绍
    从Microsoft.AspNet.Identity看微软推荐的一种MVC的分层架构
    EF How to use context.Set and context.Entry, which ships with EF4.1 ?
    C# 向IQueryable添加一个Include扩展方法
  • 原文地址:https://www.cnblogs.com/274914765qq/p/7797398.html
Copyright © 2011-2022 走看看