zoukankan      html  css  js  c++  java
  • 内存字节对齐问题

    今天看到一个求结构体偏移量的题目,可以使用宏来求解,觉得很是新奇,继续深入考虑到结构体字节对齐问题。参考网上的内容,对齐的规则有如下两条:

    1. 第一个数据成员从offset=0的地址开始放,以后的数据成员存放的起始位置要么为本数据大小的整数倍要么为其体内所含子成员大小的整数倍。
    2. 结构体的sizeof得到的大小肯定为其内部最大成员的大小的整数倍;
    3. 网上有说结构体内有子结构体时,子结构体的开始位置应该为其内部最大数据成员大小的整数倍,经实验,不符合此条。
    4. 同时可以使用#pragma pack(n),来改变对齐的大小,一般都设置为1,2,4。默认的值和机器字长有关。
     1 #include <string>
     2 #include <iostream>
     3 //#pragma pack(1)
     4 #define FIND(type, member)  (size_t)&(((type*)0)->member)
     5 using namespace std;
     6 struct aa{
     7     int a;
     8     char b;
     9     double c;
    10 };
    11 
    12 struct Node{
    13     char a;
    14     int ia;
    15     double da;
    16     char b;
    17     char c;
    18     aa sa;
    19 };
    20 int main(int argc, char* argv[]){
    21     cout << FIND(struct Node, a) << endl;
    22     cout << FIND(struct Node, ia)<< endl;
    23     
    24     cout << FIND(struct Node, da)<< endl;
    25     cout << FIND(struct Node, b)<< endl;
    26     cout << FIND(struct Node, c)<< endl;
    27     cout << "sa" << FIND(struct Node, sa)<< endl;
    28     cout << "sizeof(double):" << sizeof(double) << endl;
    29     cout << "sizeof(aa):" << sizeof(aa) << endl;
    30     cout << "sizeof(Node):" << sizeof(Node) << endl;
    31 
    32     cout << "---------------------------------------";
    33     Node *p = new Node;
    34     cout << "&p:" << (int*)p << endl;
    35     cout << "&p->a:" <<(int*)&(p->ia) << endl;
    36 
    37 }
  • 相关阅读:
    php IE中文乱码
    Ehab and a 2-operation task (思维题)
    9-7链表数据求和操作
    "巴卡斯杯" 中国大学生程序设计竞赛
    Codeup 问题 B: 算法7-16:弗洛伊德最短路径算法
    一只小蜜蜂...
    结构体作为函数参数(值传递,引用传递,指针传递)
    Codeforces Round # 515 (div.3) A. Vova and Train
    查找最大元素
    JSP复习(part 4)
  • 原文地址:https://www.cnblogs.com/wyqx/p/3346364.html
Copyright © 2011-2022 走看看