Meyers提出的用于MCU寄存器抽象的新安置

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)

我真的无法弄清楚我做错了什么.

Sim*_*mer 5

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