3

TransformNode with 4 bytes to alignment boundary

这是导致此警告的代码:

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。我真的很想了解这段代码发生了什么,所以仅仅关闭警告或停止将它们视为错误并不是我想要处理的方式。

编辑:添加了更多代码。澄清一些细节(粗体)

谢谢,
加西姆

4

2 回答 2

4

我不确定您所看到的是否实际上是一个错误。通常,“所有警告”包括几乎不被视为警告的各种内容;哎呀,在大多数情况下,它们甚至都不是超级信息。

除非您使用非常特定的硬件,例如嵌入式系统,否则对齐是您可能不关心的问题。可能正在发生的事情是您的编译器默认为 8 字节对齐,并且当您定义TransformNode类时,您为 分配了 4 个字节int并“浪费”了另外 4 个字节以将整个类对齐到 8 字节边界。编译器警告告诉您“浪费”的 4 个字节。正如我所说,你可能并不关心这个。

我认为一般来说,如果您打开了最大警告和错误警告,您只会让自己发疯。如果您真的想要超级干净,退后一级警告然后将其视为错误可能更有用。

重新编辑:根据最近的编辑澄清答案。

另一个想法:尝试int在你的TransformNode类中添加另一个,看看警告是否消失(我假设它会因为int#2 将“用完”“浪费”的 4 个字节)。

您还可以查看http://en.wikipedia.org/wiki/Data_padding以更好地了解该问题。

于 2013-10-06T15:05:03.613 回答
0

您启用了哪些警告选项来获取此特定警告?我只看到两种可能性。

不要打开所有可能的警告标志。你最终会得到很多误报,所有这些噪音会让你错过真正的警告。打开具有高信噪比的警告选项,然后注意发出的每一个警告。

于 2013-10-07T13:08:00.667 回答