• 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中最大数据成员长度中比较小的那个进行;

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


    
    
  • 相关阅读:
    hdu 4258 Covered Walkway
    hdu 2337 Escape from Enemy Territory
    二分查找
    hdu 2335 Containers
    最大流 Dinic
    进程和并发编程
    黏包
    socket
    网络编程
    异常处理
  • 原文地址:https://www.cnblogs.com/kxzh/p/8574323.html
Copyright © 2020-2023  润新知