Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 静态映射超过堆栈_C++_Constructor - Fatal编程技术网

C++ 静态映射超过堆栈

C++ 静态映射超过堆栈,c++,constructor,C++,Constructor,情况是,我编写了一个汇编程序,并使用一个std::unordered_multimap容器来存储所有不同的指令,其中实际的助记符是映射中的键,关联的值是一个自定义结构,带有一些关于参数等的附加信息 因为我不需要在运行时对这个查找进行任何更改,所以我想我应该将它声明为static和const,并手动将所有值放入初始值设定项列表中 总的来说,它看起来是这样的: typedef std::wstring STRING; static const std::unordered_multimap<

情况是,我编写了一个汇编程序,并使用一个
std::unordered_multimap
容器来存储所有不同的指令,其中实际的助记符是映射中的键,关联的值是一个自定义结构,带有一些关于参数等的附加信息

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

总的来说,它看起来是这样的:

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 } },
    ...
typedef std::wstring字符串;
静态常量
std::无序_多映射指令lookup={
//{助记符,{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,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,0x00,false,true,false},
{L“AAM”{ot_none,ot_none,par_noparam,par_noparam,par_noparam,2,0xD4,0x0A,0x00,0x00,false,true,false},
...
我现在的问题是执行了很多指令(目前有1225条指令)。
因此,当我使用Visual Studio运行代码分析时,它告诉我构造函数超过堆栈98000/16384字节,因为构造函数在进一步处理它们之前,似乎首先将所有这些条目放在堆栈上

我现在的问题是如何直接初始化堆上的所有空间,最好不用重写大部分空间。

我想这就是您想要的:

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。将实现版本从分配到使用完美转发:

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);
    }
};
模板
类create_unmap
{
私人:
std::无序的多映射m映射;
公众:
模板
创建\u取消映射(参数和…\u Val)
{
m_地图布设(标准:前进(_Val)…);
}
模板
创建_unmap&operator()(Args&&…_Val)
{
m_地图布设(标准:前进(_Val)…);
归还*这个;
}
运算符std::无序的_多重映射()
{
返回std::move(mu-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));
static const std::无序多映射指令lookupt=create\u unmap
(std::分段构造,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::分段构造,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::分段构造,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));

不幸的是,实现质量问题。使容器
constexpr
发生任何变化吗?@M.M不幸的是,这不起作用,因为std::wstring类型不允许在constexpr中使用。感谢您的建议,我下周回到家后会仔细查看它。不过,为了理解,什么阻止我使用Boost.Assign,就像您提到的“map_list_of(STRING(L“AAA)”、ASM_指令{ot_none,ot_none,…})(…)”?如果没有std::对,编译器仍然会首先将堆栈上的所有指令生成为std::对,然后将它们移动/复制到映射。