zoukankan      html  css  js  c++  java
  • VS中关于字节大小的总结

    说明:关于字节对齐的问题,很多人给出的答案是通过设置#pragma pack (1)的方式进行操作。但是在不是很考虑空间占用或者不是发送协议包等情况下,为了让程序跑的更快,是不会进行该设置。

    以下均以默认的字节对齐方式

    1、在结构体中,使用的字节数对齐方式是寻找结构体中的关键字的最大占用字节数(默认最小是4字节)

    比如:

    struct Node {

    int a;

    double b;

    };

    则sizeof(Node)的大小就是16字节而不是所谓的12个字节,因为是以结构体关键字(double)的字节数是8字节,所以以该大小为字节对齐方式。

    如果是这样子:

    struct Node {

    int a;

    double b;

    char c;

    }

    则sizeof(Node)的大小就是24字节了

    2、关于成员函数指针占用的空间大小,具体的可以详见下面的链接

    http://www.linuxeden.com/html/news/20141206/157482.html

    注意,如果是这样子:

    class Base;

    typedef (Base::*Func)();

    则Func占用了16字节

    如果

    class Base;

    class Base{};

    typedef (Base::*Func)();

    那么Func只占用了四个字节。也就是说只要class Base定义在typedef (Base::*Func)();之前出现,那么它将只是占用简单的对应字节数。

    3、那么如果将成员函数指针也放进结构体里面,那会产生怎样的情况呢

    这里声明一个类

    class Base;

    typedef (Base::*Func)();

    通过第二点的链接我们知道这里的sizeof(Func)的大小是16字节

    那么如下例子

    struct Node {

    int a;

    Func func;

    double b;

    }

    sizeof(Node)应该占用多少的空间呢? 答案是8+16+8 = 32字节。既然结构体以最大的占用空间计算,那么为什么是32字节而不是48字节呢? 其实对齐方式正如我上面说的关键字(double),是C++定义的关键字。所以只占用了32字节。

  • 相关阅读:
    day67——前后端传输数据的编码格式、ajax传json数据/传文件、批量插入
    day66——choices参数、MTV/MVC模型、三种创建多对多的方式、AJAX
    day65——聚合函数、分组查询、F与Q查询、django开事务、orm查询优化
    dayⅢ、基本数据类型+运算符作业
    dayⅡ:编程语言+变量+垃圾回收制
    dayⅡ:变量作业
    dayⅠ:计算机基础知识
    ⅩⅥ:无参装饰器
    ⅩⅤ:作业
    ⅩⅤ:名称空间与作用域
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/4746620.html
Copyright © 2011-2022 走看看