2013-10-06 36 views
3

TransformNode with 4 bytes to alignment boundary什么意思错误:...在Xcode/Clang中的“字节到对齐边界”?

这里是导致此警告的代码:

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得到节点类的错误发生。我正在使用xcode 5.0,并且所有警告都已打开,并将警告视为错误。我真的很想了解这段代码究竟发生了什么,所以只需关闭警告或停止处理它们,因为错误不是我想要处理的方式。

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

感谢,
卡西姆

+2

发布更多代码。 –

+0

我应该添加更多的代码吗? – Gasim

+0

*我应该添加更多的代码吗?* **是**。您仍未显示将节点转换为Transform节点的位置。如果没有那些关键的代码,我们怎么能告诉你哪里出错了? –

回答

4

我不知道,如果你看到的其实是一个错误。一般而言,“所有警告”包括几乎不被视为警告的各种东西;哎呀,大多数情况下,他们甚至都没有超级信息。

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

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

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

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

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

+0

这对于这些信息非常重要。我按照你的建议添加了另一个'int',它实际上带走了警告。现在,我试图找出真正导致此警告的原因:) – Gasim

+0

阅读完文章后,我意识到这可能是由于我在架构中使用了64位体系结构。我现在改为32位,没有更多的警告:) – Gasim

+0

这是有道理的。很高兴它有帮助。 – keefer

0

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

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

+0

匿名downvoter:downvote的理由是很好的。举个例子,我喜欢用'-Werror'使警告成为编译错误。使用'-Weverything',甚至'-Wpadded',配合'-Werror'是一个好主意。如果您使用其他您无法控制的代码库,这是一个特别糟糕的想法。 –