具有 4 个字节到对齐边界的 TransformNode
这是导致此警告的代码:
class TransformNode : public Node {
public:
int number;
public:
void test() { number = 12; }
};
//Node.h
class Node {
public:
typedef std::set<Node *> ChildSet;
protected:
ChildSet mChildren;
Node * mParent;
public:
Node(Node * parent=0) : mParent(parent) {}
~Node() {}
Node * addChild(Node * node);
inline Node * getParent() { return mParent; }
const ChildSet &getChildren() const { return mChildren; }
};
inline void node_test() {
TransformNode * node = new TransformNode;
node->test();
std::cout << node->number << "\n";
}
int main() {
node_test();
return 0;
}
当我从类 TransformNode 派生 Node 类时发生错误。我正在使用 xcode 5.0 并打开所有警告并将警告视为错误。我真的很想了解这段代码发生了什么,所以只是关闭警告或停止将它们视为错误并不是我想要的处理方式。
编辑:添加了更多代码。澄清一些细节(粗体)
谢谢,
加西姆
最佳答案
我不确定您看到的是否真的是一个错误。通常,“所有警告”包括几乎不被视为警告的各种内容;哎呀,在大多数情况下,它们甚至都不是 super 有用的信息。
对齐是一个您可能不关心的问题,除非您使用的是非常特殊的硬件,例如在嵌入式系统中。可能发生的情况是您的编译器默认为 8 字节对齐,并且当您定义 TransformNode
类时,您正在为 int
分配 4 个字节并“浪费”4更多字节以将整个类对齐到 8 字节边界。编译器警告告诉您“浪费”了 4 个字节。正如我所说,您可能不关心这个。
我认为一般来说,如果您打开了最大警告和错误警告,您只会把自己逼疯。如果您真的想要 super 干净,则退后一级警告然后将其视为错误可能更有用。
重新编辑:根据最近的编辑澄清了答案。
另一个想法:尝试在您的 TransformNode
类中添加另一个 int
并查看警告是否消失(我假设它会因为 int
#2 将“用完”“浪费”的 4 个字节)。
您还可以查看 http://en.wikipedia.org/wiki/Data_padding更好地理解这个问题。
关于c++ - 错误 : . 是什么意思。 Xcode/Clang 中的 ."bytes to alignment boundary"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19210080/