wim*_*aan 2 c++ embedded placement-new
我只是尝试使用Scott Meyers在"嵌入式环境中的Effectice C++"中建议的一个放置新运算符.
DefaultMcuType::PortRegister* p = new(reinterpret_cast<void*>(0x05)) DefaultMcuType::PortRegister;
Run Code Online (Sandbox Code Playgroud)
然后我得到了以下错误:
register.cc: In function 'int main()':
register.cc:30:90: error: no matching function for call to 'operator new(sizetype, void*)'
DefaultMcuType::PortRegister* p = new(reinterpret_cast<void*>(0x05)) DefaultMcuType::PortRegister;
^~~~~~~~~~~~
<built-in>: note: candidate: void* operator new(unsigned int)
<built-in>: note: candidate expects 1 argument, 2 provided
<built-in>: note: candidate: void* operator new(unsigned int, std::align_val_t)
<built-in>: note: no known conversion for argument 2 from 'void*' to 'std::align_val_t'
register.cc:30:35: warning: unused variable 'p' [-Wunused-variable]
DefaultMcuType::PortRegister* p = new(reinterpret_cast<void*>(0x05)) DefaultMcuType::PortRegister;
^
Run Code Online (Sandbox Code Playgroud)
我真的无法弄清楚我做错了什么.
Placement new是一个操作员功能.您的具体应定义为
void* operator new ( std::size_t count, void* ptr );
在头文件中<new>.
使用#include <new>应解决您的问题.
有关示例,请参阅此处:https: //godbolt.org/g/iKatox
有关新运营商的更多信息,请访问:http: //en.cppreference.com/w/cpp/memory/new/operator_new
更新:
如果您无法访问新的展示位置,则可以自行定义.我使用VC++ 14版本作为模板:
#include <stdlib.h> //for std::size_t
inline void* operator new(std::size_t size, void* ptr)
{
(void)size;//unused
return ptr;
}
inline void operator delete(void*, void*)
{
return;
}
Run Code Online (Sandbox Code Playgroud)
您可以比较生成相同汇编代码的两个版本:https: //godbolt.org/g/6UjER9