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

    字节对齐简介

    内存对齐是编译器为了便于CPU快速访问而采用的一项技术

    你还可以通过pragma指令(通常为#pragma pack)强迫编译器不采用处理器惯用的对齐规则。但请别随意运用这种方式,因为它强制生成开销更大、速度更慢的代码。

    使用#pragma pack的唯一理由是——假如你需让C语言的数据分布,与某种位级别的硬件或协议完全匹配(例如内存映射硬件端口),而违反通用对齐规则又不可避免。如果你处于这种困境,且不了解我所讲述的内容,那你已深陷泥潭,祝君好运。

    另外,__attribute__(__aligned__(n))可以指定,分配的内存按多少位对齐,但是不能改小;pargma pack不能改大。

    对齐规则

    1. 如果设置了内存对齐为 i 字节,类中最大成员对齐字节数为j,那么整体对齐字节n = min(i, j) (某个成员的对齐字节数定义:如果该成员是c++自带类型如int、char、double等,那么其对齐字节数=该类型在内存中所占的字节数;如果该成员是自定义类型如某个class或者struct,那个它的对齐字节数 = 该类型的整体对齐字节)
    2. 每个成员对齐规则:类中第一个数据成员放在offset为0的位置;对于其他的数据成员(假设该数据成员对齐字节数为k),他们放置的起始位置offset应该是 min(k, n) 的整数倍
    3. 整体对齐规则:最后整个类的大小应该是n的整数倍
    4. 当设置的对齐字节数大于类中最大成员对齐字节数时,这个设置实际上不产生任何效果;当设置对齐字节数为1时,类的大小就是简单的把所有成员大小相加

    以上设置规则第一条只针对pragma pack;对于__attribute__(__aligned__(n)),在设置大于类中最大成员对齐字节数的时候有效。

    例子

    组合

    class temp 
    { 
        char c; 
        int i; 
        short s1; 
    };
    
    class node
    {
        char c; //放在位置0,位置区间[0]
        temp t; //4(temp的对齐字节数) = n, 那么放置起始位置应该是4的倍数,即4,位置区间为[4~15]
        short s; //2 < n,那么放置起始位置应该是2的倍数,即16,位置区间为[16~17]
    };
    
    

    此时成员共占用[0~17]18个字节,还要整体对齐,大小应该是4的倍数,因此大小是20

    继承

    class A
    {
        int i;
        char c1;
    };
    
    class B:public A
    {
        char c2;
    };
    
    class C:public B
    {
        char c3;
    }
    

    gcc和vs对sizeof(C)给出了不同的结果,分别是8、16

    1. GCC:C相当于把所有成员i、c1、c2、c3当作是在一个class内部,(先继承后对齐)
    2. 对于A,对齐后其大小是8;对于B,c2加上对齐后的A的大小是9,对齐后就是12;对于C,c3加上对齐后的B大小是13,再对齐就是16 (先对齐后继承)

    sizeof实现

    #define sizeof_value(L_Value) (                    /  
        (char *)(&L_Value + 1) - (char *)&L_Value   /  
    )  
    
    #define sizeof_type(type) (
        (type*)(0) + 1
    )
    
  • 相关阅读:
    BZOJ5212 ZJOI2018历史(LCT)
    BZOJ5127 数据校验
    253. Meeting Rooms II
    311. Sparse Matrix Multiplication
    254. Factor Combinations
    250. Count Univalue Subtrees
    259. 3Sum Smaller
    156. Binary Tree Upside Down
    360. Sort Transformed Array
    348. Design Tic-Tac-Toe
  • 原文地址:https://www.cnblogs.com/biterror/p/7053420.html
Copyright © 2011-2022 走看看