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字节。

  • 相关阅读:
    NC外部统一流程管理平台方案
    Activiti 多个并发子流程的应用
    基于Activiti的流程应用开发平台JSAAS-WF V5.3
    整合Acitiviti在线流程设计器(Activiti-Modeler 5.18.0)
    基于Spring Security 的JSaaS应用的权限管理
    微信分享功能开发
    ORACLE schedule job设置
    存储过程清理N天前数据
    oracle函数trunc的使用
    往前往后推时间(排除工作日和节假日)
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/4746620.html
Copyright © 2011-2022 走看看