2013-10-06 39 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'是一個好主意。如果您使用其他您無法控制的代碼庫,這是一個特別糟糕的想法。 –