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),因此在这两种环境中都可以使用的解决方案是很好的
问题
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行代码。