【问题标题】:Is it possible to place a std::array at a fixed memory address?是否可以将 std::array 放置在固定的内存地址?
【发布时间】:2021-11-23 04:06:03
【问题描述】:

对于嵌入式设计,我想将 C++ std::array 放置在特定的内存地址,该地址指向硬件和软件共享的缓冲区。这可能吗?

【问题讨论】:

  • placement new 上掠夺,尽管您必须对std::array 的布局做出一些标准不能保证的假设。 Placement new 也会初始化内存,这可能是你不想要的......

标签: c++11 std


【解决方案1】:

试试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 auto & arr = *parr'这行吗?它是否提供了对数组的引用?
  • 其实const是没有必要的,只是我的习惯将我没有改变的东西声明为const。至于参考:这只是简化符号的一种方式。在auto &amp; arr = *parr; 之后,编译器必须将arr 理解为(*parr),因此您不需要使用像(void*) &amp;(*parr) 这样的晦涩符号。改用(void*) &amp;arr 会更简单、更容易理解。编译器生成的代码应该完全相同。换句话说:在 C++ 中,引用 (&) 最常用于传递函数参数,但有时用于简化符号。
  • 用更简单的话来说:放置 new 会迫使您使用指针。但是如果我们真的不需要指针,我们会避免使用它们。在这里,通过使用引用,您可以忘记您可以通过指针访问std::array,并将其视为具有“值”语法的“普通”数组(不需要*)。
【解决方案2】:

对于嵌入式代码,我想到了两个简单的解决方案:

  1. 声明extern int myArray[1234] ;,然后在链接器定义文件中定义myArray(或者更确切地说是它的错位形式)。
  2. 定义宏:#define myArray ((int*)0xC0DEFACE)

第一个解决方案是针对纯粹主义者的;第二个是实用主义者。

【讨论】:

    猜你喜欢
    • 2011-07-18
    • 2021-08-18
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 2012-04-22
    • 2011-11-13
    • 2017-01-28
    • 2015-05-26
    相关资源
    最近更新 更多