2015-07-22 68 views
4

我在我的代码非常愚蠢的错别字......为什么sizeof(this-id)返回8?

is.read((char*)&this->id, sizeof(this-id)); 

失踪>字符后this-

有趣sizeof(this - id)返回8!

我的想法是...因为this是一个指针,所以在this上做减法将会导致另一个指针被id值取消,这个指针可以取决于id的值。

而且...在64位系统上,指针通常是8个字节!

我正确吗?或缺少什么?

以下是我所拥有的课程。

class IndexItem : public Serializable { 
public: 
    IndexItem(uint32_t id, std::streampos pos) : 
    id(id), 
    pos(pos) 
    { } 
    uint32_t id; 
    std::streampos pos; 
protected: 
    std::ostream& Serialize(std::ostream& os) const override { 
    os.write((char*)&this->id, sizeof(this->id)); 
    os.write((char*)&this->pos, sizeof(this->pos)); 
    return os; 
    } 

    std::istream& Deserialize(std::istream& is) override { 
    is.read((char*)&this->id, sizeof(this->id)); 
    is.read((char*)&this->pos, sizeof(this->pos)); 
    return is; 
    } 
}; 

回答

8

你是正确的。您可以将积分类型添加或减去任何指针,从而产生另一个指针,并在您的系统中恰好为8。

+0

从技术上讲,这个指针减法是未定义的行为,但我们有sizeof的操作数[未评估,因此这可以避免未定义的行为](http://stackoverflow.com/q/28714018/1708801)的保存优雅。 –

+0

@ShafikYaghmour,即使你不解除减法的结果,它是不确定的吗?无论如何,正如你所说,因为这发生在sizeof内部,这里没有UB。 – toth

+0

它仍然必须是一个有效的指针。 –