是否可以将 std::array 放在固定的内存地址?
Is it possible to place a std::array at a fixed memory address?
对于嵌入式设计,我想将 C++ std::array 放在特定的内存地址,该地址指向由硬件和软件共享的缓冲区。这可能吗?
尝试 Placement new:
#include <array>
#include <iostream>
int main()
{
alignas(double) char buffer[100];
auto parr = new (buffer) std::array<double, 3> {3.14, 15.161, 12};
const auto & arr = *parr;
std::cout << (void*) &arr << " " << (void*) buffer << "\n";
for (auto x: arr)
std::cout << x << " ";
std::cout << "\n";
}
可能会给出以下输出:
0x7ffcdd906770 0x7ffcdd906770
3.14 15.161 12
需要担心的一点是,你要使用的地址是否与你要存放的数据在数组中的对齐要求一致。您很可能会处理 char
s、float
s 或 int
s,因此执行此条件应该不难。
对于嵌入式代码,两个简单的解决方案spring要记住:
- 声明
extern int myArray[1234] ;
,然后在您的链接器定义文件中定义 myArray
(或者更确切地说是其损坏的形式)。
- 定义一个宏:
#define myArray ((int*)0xC0DEFACE)
第一个解决方案是为纯粹主义者准备的;第二个是实用主义者。
对于嵌入式设计,我想将 C++ std::array 放在特定的内存地址,该地址指向由硬件和软件共享的缓冲区。这可能吗?
尝试 Placement new:
#include <array>
#include <iostream>
int main()
{
alignas(double) char buffer[100];
auto parr = new (buffer) std::array<double, 3> {3.14, 15.161, 12};
const auto & arr = *parr;
std::cout << (void*) &arr << " " << (void*) buffer << "\n";
for (auto x: arr)
std::cout << x << " ";
std::cout << "\n";
}
可能会给出以下输出:
0x7ffcdd906770 0x7ffcdd906770
3.14 15.161 12
需要担心的一点是,你要使用的地址是否与你要存放的数据在数组中的对齐要求一致。您很可能会处理 char
s、float
s 或 int
s,因此执行此条件应该不难。
对于嵌入式代码,两个简单的解决方案spring要记住:
- 声明
extern int myArray[1234] ;
,然后在您的链接器定义文件中定义myArray
(或者更确切地说是其损坏的形式)。 - 定义一个宏:
#define myArray ((int*)0xC0DEFACE)
第一个解决方案是为纯粹主义者准备的;第二个是实用主义者。