2017-01-12 162 views
2

對於我並不想進入這裏的原因初始化C++結構,我有整合其他地方寫在我們的節目以最小的改變他們的代碼一些代碼。代碼必須創建一個結構作爲一個局部變量(在棧上)構造函數,然後將其分配給這樣的成員變量:堆上,而不是堆棧

struct S 
{ 
    // lots of real_T's and uint32_T's and structs and structs within structs 
}; 

class C 
{ 
private: 
    S s; 
    // among other members 
}; 

C::C() 
{ 
    S tempS = { 
     // more than 52k lines of code!!! 
    }; 
    s = tempS; 
} 

他們的代碼是從某種MATLAB模型的自動生成,當然,那就是在構造器的初始化器中超過52,000行代碼。 它會導致明顯的原因堆棧溢出,這是我試圖解決實際問題。

C類正在堆上創建(實際上它是從C派生的類的包裝),我的理解是這意味着C.s也在堆上。

請注意,我們目前使用Visual Studio 2010,但我們將移動到Visual Studio 2015年快(TM),這樣的解決方案,在任何工作都很好。

問題

  1. 有沒有辦法直接初始化C.S?

  2. 還是有辦法將其複製到C.S無需重寫52K行的初始化代碼之前,在堆上創建臨時工?

這些方式似乎都不適合我:http://en.cppreference.com/w/cpp/language/value_initialization

(6)看起來像什麼,我想:

S * tempS = new S { 
    // more than 52k lines of code!!! 
}; 

但它會導致編譯錯誤:「錯誤C2143:語法錯誤:缺少 ';'前 '{'」

+2

會發生什麼事是你,而不是在成員初始化列表初始化's'直接? – NathanOliver

+0

結構中的52k行?哇。但是你可以修改你的嘗試'S * tempS = new S {...'到'S * tempS = new S;'並且它們用'S-> var = ...初始化每個成員' –

+0

這個「超過52k代碼行!!!「評論實際上讓我非常害怕。代碼味道,任何人? – roalz

回答

0

我會考慮tempS私人靜態利弊成爲C的成員(並將其定義在另一個編譯單元中)。這個初始化程序/原型基本上是數據,只是使代碼不可讀。此外,無論您在何處/如何定義它,都可以在二進制文件中的某處找到這些數據,因此您不妨明確說明。

+0

這工作!我只是將'S tempS = {'改爲'static const S tempS = {'(參見上面我的原始示例)。 感謝您的幫助! – user7912

+0

我有時會忘記我們的選擇不僅僅侷限於堆和堆棧。我最近閱讀了一篇文章(或Stack Overflow的答案?),講述了將不同的內存分配給不同的存儲區的方法,但我忘記了在哪裏。 – user7912

4

Is there a way to initialize C.s directly?

是,只需更換此代碼:

C::C() 
{ 
    S tempS = { 
     // more than 52k lines of code!!! 
    }; 
    s = tempS; 
} 

與此:

C::C() : 
    s { 
     // more than 52k lines of code!!! 
    } 
{ 
} 

,你可以see here它應該在編譯器工作,支持C + +11或更高版本

+0

我試過了,但沒有奏效。它在第一個'{'處出現編譯錯誤。 – user7912

+0

如果你的編譯器支持C++ 11,它應該可以工作,你說你可以切換到2015,所以這樣做。 – Slava

0

我的建議是建立在S類的構造函數是把所有的成員的值作爲參數。按照它們在結構中定義的順序定義構造函數的參數列表。

struct S 
{ 
    // lots of real_T's and uint32_T's and structs and structs within structs 
    S(/*parameter_lsit*/) : /*initializer_list*/ {} 
}; 

並初始化它喜歡 -

S * tempS = new S (
    // more than 52k lines of code!!! 
); 
+0

不幸的是,這將需要重寫初始化列表的52k行代碼。 – user7912