zoukankan      html  css  js  c++  java
  • 20180315 代码错题(2)

    下面两个结构体
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct One{
        double d;
        char c;
        int i;
    }
    struct Two{
        char c;
        double d;
        int i;
    }
    在#pragma pack(4)和#pragma pack(8)的情况下,结构体的大小分别是
    16 24,16 24
    16 20,16 20
    16 16,16 24
    16 16,24 24

    答案C 错选D

    许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对齐。

    每个特定平台上的编译器都有自己的默认“对齐系数”(32位机一般为4,64位机一般为8)。我们可以通过预编译命令#pragma pack(k),k=1,2,4,8,16来改变这个系数,其中k就是需要指定的“对齐系数”;也可以使用#pragma pack()取消自定义字节对齐方式。

    struct 或者 union 成员对齐规则如下:

    1. 第一个数据成员放在offset为0的地方,对齐按照对齐系数和自身占用字节数中,二者比较小的那个进行对齐;

    2. 在数据成员完成各自对齐以后,struct或者union本身也要进行对齐,对齐将按照对齐系数和struct或者union中最大数据成员长度中比较小的那个进行;

    先局部成员对齐,然后再全局对齐。


    
    
  • 相关阅读:
    git基本操作及设置
    5-13 多页面打包配置
    笔记待整理
    单例模式在多线程下的多种实现模式
    面试题小练习1106
    求两个字符串的最大共有子串
    单例模式
    静态初始化一个二维数组并将二维数组排序并输出
    java中数组的基本知识
    关于break语句如何结束多重循环的嵌套
  • 原文地址:https://www.cnblogs.com/kxzh/p/8574323.html
Copyright © 2011-2022 走看看