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
我只是尝试使用 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