具有不同范围内的许多变量的大文件的堆栈溢出
Stack overflow for huge file with many variables in different scopes
我有一个自动生成的文件,用于创建结构并使用它们进行一些计算。
每个结构都有其专用范围。
typedef struct
{
uint16_t a;
uint16_t b;
} Addition_t;
uint8_t StructsOverflow(void)
{
{ // use new scope to declare same variable multiple times
Addition_t x = {.a = 5, .b=6};
if (x.a == x.b)
return 1;
}
{
Addition_t x = {.a = 3, .b=6};
if (x.a == x.b)
return 1;
}
{
Addition_t x = {.a = 3, .b=5};
if (x.a == x.b)
return 1;
}
// and so on
// here other structs are created in the same fashion as above
return 0;
}
对于大量的行(大约 100,000 个结构),运行 .exe 以 Whosebug 停止:Exception thrown at 0x00007FF7F2C8B6C8 in EnergyPredictionMain.exe: 0xC00000FD: Stack overflow (parameters: 0x0000000000000001, 0x0000001815603000).
.
我正在使用 MSVC 2019 编译器和 cppvsdbg 进行调试。
为什么会出现Whosebug?在我的理解中,变量在范围之后被销毁,所以应该只使用一个结构的内存。
为什么?因为,在调试版本 (IIRC) 中,MSVC 不会以这种方式在超出范围时释放局部变量。在发布版本中,它可能会工作。
但是,IMO,这里真正有问题的是自动生成该文件的内容。将其更改为生成 100,000 个单独的 sub-functions,每个初始化(然后处理)一个结构是否可行?然后从一个(也是 auto-generated)'master' 函数中依次调用它们中的每一个。
如果你能做到这一点,它应该提供一个强大的 future-proof 修复。
我有一个自动生成的文件,用于创建结构并使用它们进行一些计算。 每个结构都有其专用范围。
typedef struct
{
uint16_t a;
uint16_t b;
} Addition_t;
uint8_t StructsOverflow(void)
{
{ // use new scope to declare same variable multiple times
Addition_t x = {.a = 5, .b=6};
if (x.a == x.b)
return 1;
}
{
Addition_t x = {.a = 3, .b=6};
if (x.a == x.b)
return 1;
}
{
Addition_t x = {.a = 3, .b=5};
if (x.a == x.b)
return 1;
}
// and so on
// here other structs are created in the same fashion as above
return 0;
}
对于大量的行(大约 100,000 个结构),运行 .exe 以 Whosebug 停止:Exception thrown at 0x00007FF7F2C8B6C8 in EnergyPredictionMain.exe: 0xC00000FD: Stack overflow (parameters: 0x0000000000000001, 0x0000001815603000).
.
我正在使用 MSVC 2019 编译器和 cppvsdbg 进行调试。
为什么会出现Whosebug?在我的理解中,变量在范围之后被销毁,所以应该只使用一个结构的内存。
为什么?因为,在调试版本 (IIRC) 中,MSVC 不会以这种方式在超出范围时释放局部变量。在发布版本中,它可能会工作。
但是,IMO,这里真正有问题的是自动生成该文件的内容。将其更改为生成 100,000 个单独的 sub-functions,每个初始化(然后处理)一个结构是否可行?然后从一个(也是 auto-generated)'master' 函数中依次调用它们中的每一个。
如果你能做到这一点,它应该提供一个强大的 future-proof 修复。