C++ 初始化C++;堆上而不是堆栈上的结构

C++ 初始化C++;堆上而不是堆栈上的结构,c++,struct,heap,stack-overflow,C++,Struct,Heap,Stack Overflow,出于我不想在这里讨论的原因,我必须将其他地方编写的一些代码集成到我们的程序中,对它们的代码进行最小的更改。代码有一个构造函数,该构造函数创建一个结构作为局部变量(在堆栈上),然后将其分配给成员变量,如下所示: 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

出于我不想在这里讨论的原因,我必须将其他地方编写的一些代码集成到我们的程序中,对它们的代码进行最小的更改。代码有一个构造函数,该构造函数创建一个结构作为局部变量(在堆栈上),然后将其分配给成员变量,如下所示:

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模型自动生成的,是的,在结构的初始值设定项中有52000多行代码它导致堆栈溢出的原因显而易见,这正是我试图解决的实际问题。

类C是在堆上创建的(实际上它是从C派生的类的包装器),我的理解是这意味着C.s也在堆上

请注意,我们目前使用的是Visual Studio 2010,但我们很快就会转移到Visual Studio 2015(TM),因此在这两种环境中都可以使用的解决方案是很好的

问题

  • 有没有办法直接初始化C.s

  • 或者有没有一种方法可以在将堆复制到C.s之前在堆上创建temp,而无需重写52k行初始化器代码

  • 这些方法似乎都不适合我:

    (6) 看起来像我想要的:

    S * tempS = new S {
        // more than 52k lines of code!!!
    };
    
    但它会导致一个编译错误:“错误C2143:语法错误:在“{”之前缺少“;”

    有没有办法直接初始化C.s

    是的,只需替换此代码:

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

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

    你可以在编译器上工作,它支持C++ 11或更高版本

    我会考虑制作<代码> TEMPs <代码> C <代码>的私有静态常量成员(并在另一个编译单元中定义)。此初始值设定项/原型基本上是数据,只会使代码无法读取。此外,此数据位于二进制文件中的某个位置,无论您在何处/如何定义它,因此您最好将其显式化。

    我的建议是在类
    S
    中创建一个构造函数,以所有成员的值作为参数。定义t的参数列表按照结构中定义的顺序创建构造函数

    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!!!
    );
    

    发生的情况是您直接在成员初始值设定项列表中初始化了
    s
    ?结构中有52k行?哇。但是您可以将您的尝试
    s*tempS=news{…
    修改为
    s*tempS=new s;
    并使用
    s->var=…
    初始化每个成员,“超过52k行代码!!!”评论真的吓了我一大跳。代码有味道,有人吗?我想你的另一个选择是增加程序的堆栈大小。VS2010已经过时,它可能理解也可能不理解新的{…}语法。移动到2015年。我试过了,但没有成功。它一开始就给出了一个编译错误{.如果你的编译器支持C++11,它应该可以工作,你说你可以切换到2015,那么就这样做.这成功了!我刚刚将
    S tempS={
    更改为
    static const S tempS={
    (参见上面我的原始示例).谢谢你的帮助!有时我忘记了我们的选项不仅仅限于堆和堆栈.我最近读了一篇文章(或堆栈溢出回答?)谈论将某些内容分配到不同内存区域的不同方法,但我忘记了在哪里。不幸的是,这需要重写初始化列表的52k行代码。