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++问题。(和%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);}
};