gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:29:24 25 4
gpt4 key购买 nike

我只是尝试使用 Scott Meyers 在“Effectice C++ in an Embedded Environment”中建议的 placement new 运算符。

    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


更新:

如果您无权访问 placement 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

关于c++ - Meyers 提出的 MCU 寄存器抽象的新布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41144614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com