为什么sizeof不关心功能?

时间:2017-06-28 20:20:37

标签: c++

鉴于以下内容,您将看到x和y的大小相同,但y具有附加功能。 sizeof中包含哪些内容,哪些内容不包含?

struct x
{
    double a;
    double b;
    double c;
    double d;
};
struct y
{
    double a;
    double b;
    double c;
    double d;
    y(double q, double r, double s, double t) : a(q), b(r), c(s), d(t) {};
};
std::cout << sizeof(x)-sizeof(y) <<std::endl;

2 个答案:

答案 0 :(得分:6)

  

sizeof中包含哪些内容,哪些内容不包含?

sizeof()仅包含必须作为每个类型实例的一部分存储在内存中的内容。 (对于类或结构,它返回需要为实例分配的内存量。)

由于struct y的每个实例的函数都是相同的,因此它不作为结构的一部分存储 - 定义它只是允许函数作为结构上的方法被调用。但是,如果它是一个函数指针,则指针将成为结构的一部分,并且会对其大小产生影响。

答案 1 :(得分:2)

5.3.3 Sizeof [expr.sizeof]

1 sizeof 运算符生成其操作数的对象表示中的字节数。
操作数是 表达式,它是未评估的操作数(第5条),或者是带括号的 type-id sizeof 运算符不应适用于具有函数或不完整类型的表达式 在其声明所有枚举数之前,其基础类型未固定的类型为括号 此类型的名称,或指定位域的glvalue。 sizeof(char) sizeof(signed char)
sizeof(unsigned char) 是1. sizeof 应用于任何其他基本类型(3.9.1)的结果是 实现定义。 [注意:特别是 sizeof(bool) sizeof(char16_t) {{1} } ,和 sizeof(char32_t) 是实现定义的。 75
- 结束注释] [注意:有关 byte 的定义,请参见1.7 和对象
表示
的定义3.9。 - 结束记录]

2应用于参考或参考类型时,结果为引用类型的大小。
应用时 对于一个类,结果是该类对象的字节数,包括所需的任何填充 将该类型的对象放在数组中。大多数派生类的大小应大于零(1.8)。 将 sizeof(wchar_t) 应用于基础类子对象的结果是基类类型的大小。 76 应用时 对于数组,结果是数组中的总字节数。这意味着 n 数组的大小 元素 n 是元素大小的倍数。

3 sizeof 运算符可以应用于指向函数的指针,但不应直接应用于函数。

C++ Online Working Draft

在C ++中,没有理智的实现将函数的机器代码存储在对象实例中的冗余副本;这不仅是对空间的巨大浪费,大多数架构(我知道,无论如何)都不允许你将机器代码与数据混合,因此它不会影响对象表示的大小。