C++ sizeof*此对象

C++ sizeof*此对象,c++,C++,代码: 我期望: 4 4 4 8 为什么我的期望是错误的?sizeof在编译时解决,而不是在运行时解决。所以sizeof(*这个)相当于sizeof(myc)我不知道“为什么你的期望是错误的”,因为我不能读心术:)。但是如果你写 sizeof(myc),sizeof(d_myc) 编译器将生成与上面代码完全相同的代码。myc有1个int,假设是32位,所以有4个字节。d_myc有2个整数=>8个字节。这在编译时解决: 4 8 4 8 i、 e.*此始终是myc,永远不会是d_myc。 要获得

代码:

我期望:

4 4
4 8

为什么我的期望是错误的?

sizeof
在编译时解决,而不是在运行时解决。所以
sizeof(*这个)
相当于
sizeof(myc)

我不知道“为什么你的期望是错误的”,因为我不能读心术:)。但是如果你写 sizeof(myc),sizeof(d_myc)
编译器将生成与上面代码完全相同的代码。myc有1个int,假设是32位,所以有4个字节。d_myc有2个整数=>8个字节。

这在编译时解决:

4 8
4 8
i、 e.
*此
始终是myc,永远不会是
d_myc

要获得所需的内容,您必须重写
d_myc
中的函数,以便在作为基的派生函数中执行相同的操作。这是因为<代码> siZeof(dyMyc)也包含基类。

我删除了C标记,因为这显然不是C.<代码>类< /C> >等是C++构造;这个代码不能在C中编译,所以这是C++问题。(和 CSTDIO < /C> >是C++,而不是C。这里我有点担心您可能打算用<代码> sieOS/<代码>信息……我只是想检查对象的大小:DThe <代码> sieOS/<代码>运算符产生<代码> siZixt < /Cult>结果,而不是<代码> int <代码>。
%d
格式需要int参数。对于大小,如果您的系统支持,请使用
“%zu”
,或者使用
“%lu”
并强制转换为
无符号长字符。(是的,有些系统会产生影响。)而且,重要的是,作用于给定表达式的静态类型,在本例中为
myc
。因此,如果您将si设置为虚拟,并在每个类中复制/粘贴它,那么它将正常工作。@ildjarn:即使它是虚拟的,也不会产生影响。@Oli:是的,我在编辑后几秒钟就把它编辑掉了-P@osgx:那完全有可能!但是我从来没有调查过这样的事情,因为它们是非标准的。这并不能回答问题,这是关于
sizeof
如何在多态上下文中运行的。逻辑很简单,我试图得到
sizeof(a)
调用
a.si()
sizeof(b)
调用
b.si()
4 8
4 8
class myc {
    int dummy;
public:
    int si(){return sizeof(*this);}
};