【发布时间】:2021-11-23 04:06:03
【问题描述】:
对于嵌入式设计,我想将 C++ std::array 放置在特定的内存地址,该地址指向硬件和软件共享的缓冲区。这可能吗?
【问题讨论】:
-
在placement new 上掠夺,尽管您必须对
std::array的布局做出一些标准不能保证的假设。 Placement new 也会初始化内存,这可能是你不想要的......
对于嵌入式设计,我想将 C++ std::array 放置在特定的内存地址,该地址指向硬件和软件共享的缓冲区。这可能吗?
【问题讨论】:
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
需要担心的一点是你要使用的地址是否与你要保存在数组中的数据的对齐要求一致。您很可能会处理chars、floats 或ints,所以这个条件应该不难执行。
【讨论】:
const是没有必要的,只是我的习惯将我没有改变的东西声明为const。至于参考:这只是简化符号的一种方式。在auto & arr = *parr; 之后,编译器必须将arr 理解为(*parr),因此您不需要使用像(void*) &(*parr) 这样的晦涩符号。改用(void*) &arr 会更简单、更容易理解。编译器生成的代码应该完全相同。换句话说:在 C++ 中,引用 (&) 最常用于传递函数参数,但有时用于简化符号。
std::array,并将其视为具有“值”语法的“普通”数组(不需要*)。
对于嵌入式代码,我想到了两个简单的解决方案:
extern int myArray[1234] ;,然后在链接器定义文件中定义myArray(或者更确切地说是它的错位形式)。#define myArray ((int*)0xC0DEFACE)
第一个解决方案是针对纯粹主义者的;第二个是实用主义者。
【讨论】: