gpt4 book ai didi

c++ - 静态 map 超出堆栈

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:05:48 35 4
gpt4 key购买 nike

情况是我编写了一个汇编程序,我正在使用 std::unordered_multimap 容器来存储所有不同的指令,其中实际的助记符是我的 key 到 map 中,相关联的值是一个自定义结构,其中包含一些关于参数等的附加信息。

因为我不需要在运行时对这个查找进行任何更改,所以我想我应该将它声明为 static 和 const 并将所有值手动放入一个 initializer_list 中。

整体看起来是这样的:

typedef std::wstring STRING;

static const
std::unordered_multimap<STRING, ASM_INSTRUCTION> InstructionLookup = {
// { MNEMONIC, { Opcode1, Opcode2, Param1Type, Param2Type, Param3Type, NrBytes, Bt1, Bt2, Bt3, Bt4, NoRexW, InvalidIn64Bit, InvalidIn32Bit } },
{ L"AAA",{ ot_none, ot_none, par_noparam, par_noparam, par_noparam, 1, 0x37, 0x00, 0x00, 0x00, false, true, false } },

{ L"AAD",{ ot_none, ot_none, par_noparam, par_noparam, par_noparam, 2, 0xD5, 0x0A, 0x00, 0x00, false, true, false } },
{ L"AAD",{ ot_ib, ot_none, par_imm8, par_noparam, par_noparam, 1, 0xD5, 0x00, 0x00, 0x00, false, true, false } },

{ L"AAM",{ ot_none, ot_none, par_noparam, par_noparam, par_noparam, 2, 0xD4, 0x0A, 0x00, 0x00, false, true, false } },
...

我现在的问题是执行了很多指令(目前有 1,225 条指令)。
因此,当我使用 Visual Studio 运行代码分析时,它告诉我构造函数超出堆栈 98,000/16,384 字节,因为构造函数首先将所有这些条目放入堆栈,然后再进一步处理它们。

我现在的问题是如何直接在堆上初始化所有这些空间,最好不必重写很多。

最佳答案

我认为emplace是你要找的:

InstructionLookup.emplace(std::piecewise_construct, std::forward_as_tuple(L"sXs"), std::forward_as_tuple(ot_none, ot_none, par_noparam, par_noparam, par_noparam, 1, 0x37, 0x00, 0x00, 0x00, false, true, false));

我尽量保留您的语法并更改了 Boost.Assign 实现版本 here使用完美转发:

template <typename T, typename U>
class create_unmap
{
private:
std::unordered_multimap<T, U> m_map;
public:

template <typename ...Args>
create_unmap(Args&&... _Val)
{
m_map.emplace(std::forward<Args>(_Val)...);
}

template <typename ...Args>
create_unmap<T, U>& operator()(Args&&... _Val)
{
m_map.emplace(std::forward<Args>(_Val)...);
return *this;
}

operator std::unordered_multimap<T, U>()
{
return std::move(m_map);
}
};

您可以使用以下语法声明您的 map :

static const std::unordered_multimap<STRING, ASM_INSTRUCTION> InstructionLookupt = create_unmap<STRING, ASM_INSTRUCTION>
(std::piecewise_construct, std::forward_as_tuple(L"AAA"), std::forward_as_tuple(ot_none, ot_none, par_noparam, par_noparam, par_noparam, 1, 0x37, 0x00, 0x00, 0x00, false, true, false))
(std::piecewise_construct, std::forward_as_tuple(L"AAD"), std::forward_as_tuple(ot_none, ot_none, par_noparam, par_noparam, par_noparam, 1, 0x37, 0x00, 0x00, 0x00, false, true, false))
(std::piecewise_construct, std::forward_as_tuple(L"AAD"), std::forward_as_tuple(ot_none, ot_none, par_noparam, par_noparam, par_noparam, 1, 0x37, 0x00, 0x00, 0x00, false, true, false));

关于c++ - 静态 map 超出堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50536915/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com