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

  • 相关阅读:
    Teradata中fastload使用
    Teradata 的rank() 和 row_number() 函数
    Oracle 10g下载链接
    SSH时不需输入密码
    Linux环境下GIT初次使用
    模块与包的概念
    迭代器 生成器
    Python
    Python
    函数式编程-尾递归、尾调用
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/4746620.html
Copyright © 2011-2022 走看看