2011-09-19 40 views
1

如果我有一个类如下:指定。保持原始大小

class MyData 
{ 
public: 
    MyData(const AnotherObject& obj); 

    int getA() { return A; } 
    int getB() { return B; } 

private: 
    int A : 16; 
    int B : 16; 
} 

会,我已指定变量A和B占用只有16位的事实,由干将呈现毫无意义?如果我传递了这个类的实例,而其他对象想要访问A和B,但是我想保留我指定的大小,那么我会因为getA()和getB()将返回32位副本而失去它吗?

我会更好地公开A和B,并根据需要直接访问它们吗?这会保持尺寸吗?或者我应该从getters返回对它们的引用吗?

回答

3

获得者将根据系统值将16位值转换为int的大小,并返回32位副本(如果大小为32位)。

你试图实现什么?为什么不从<cstdint>使用int16_t

+1

我试图保留一组数据的遗留大小,因为它们稍后将被另一个遗留系统解释。我没有考虑过使用像int16_t这样的类型 - 听起来像是正确的方法。谢谢。 –

0

返回类型getAgetB对类的布局没有影响。所以你的代码应该按照你的想法工作。

0

在大多数C++实现中,添加非虚拟方法不会更改类实例的大小或内存布局。当您添加虚拟方法或继承时,类内存布局很可能会改变。

当然要注意,确切的内存布局是依赖于实现的,这意味着它可能会根据编译器厂商,编译器版本甚至编译器选项而改变。