Meyers 提出的 MCU 寄存器抽象的新布局

Placement new for MCU register abstraction proposed by Meyers

我只是尝试使用 Scott Meyers 在 "Effectice C++ in an Embedded Environment" 中建议的放置新运算符。

    DefaultMcuType::PortRegister* p = new(reinterpret_cast<void*>(0x05)) DefaultMcuType::PortRegister;

然后我得到以下错误:

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;
                               ^

我真的想不通我做错了什么。

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;
}

您可以比较生成相同汇编代码的两个版本: https://godbolt.org/g/6UjER9