找到一种方法,将 PIMPL 与外部常量定义一起用于实现内部数组的大小

如何解决找到一种方法,将 PIMPL 与外部常量定义一起用于实现内部数组的大小

我们有以下情况:我们使用的处理器在其 RAM 中定义了部分,必须由使用 PIMPL 原则的特殊实现使用。例如,私有实现看起来像这样:

Impl( )
{
public:
  void doSomething()
  {
    for( uint32_t i = 0; i < DATA_SIZE; ++i )
    {
      // do stuff with buf[i]
    }
  }
private:
  
  static uint8_t  buf[DATA_SIZE] __attribute__ ((section("data_buffer"),aligned (8)));
};

如您所见,此处未定义 DATA_SIZE。这里的重点是,我们可以在具有定义“data_buffer”部分的不同链接脚本的同一供应商的不同处理器上使用 Impl 内的处理器供应商提供的函数。这是可能的,因为所使用的底层系统为同一系列的不同处理器提供相同的功能。 但是必须是PIMPL,以保证如果我换到另一个厂商的不同处理器,我们可以使用另一个厂商的另一个Impl。 因此,可能有人使用具有不同 DATA_SIZE 的部分,因为他在他的项目中以不同的方式定义了他的部分(即使在同一处理器上)。 初始化和一切当然会通过构造函数等来完成。

但是是否有可能使 DATA_SIZE 可设置而不是直接在 Impl-File 中定义它?

我知道 PIMPL 的目标是编译它并定义一个 ABI,这对我来说意味着编译后的文件链接时不能改变大小。我的想法对吗? (对我来说,现在只是快速更改实现,永远不要碰上层的 PIMPL-使用软件部分,但将来我们将使用“pimpl-library”,我们只想更改编译的 Impl-文件。)

我想阻止使用您从中派生的基类/接口类以将实现完全隐藏给开发人员,并且不传递派生类的任何引用或指针,因为这将需要在上层进行软件更改层。

感谢您的意见。

解决方法

但是是否有可能使 DATA_SIZE 可设置而不是直接在 Impl-File 中定义它?

非静态成员数组的大小必须在类定义中设置。

您可以使用预处理器包含来自其他地方的值,因此在这个意义上它不必“在文件中”,但是无论大小是多少,它都必须匹配所有 TU 并更改大小只在私有实现内部而不修改接口的客户端是不可能的..


请注意,只要您将数组定义为至少是指针的大小和对齐方式,那么您就可以使用间接实现私有实现中的任何数据 - 通过存储指针并在动态存储中创建具体对象。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?