【发布时间】:2021-02-17 16:37:55
【问题描述】:
我们有以下情况:我们使用的处理器在其 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。这里的重点是,我们可以在同一供应商的不同处理器上使用 Impl 中的处理器供应商提供的函数,并使用不同的链接脚本定义“data_buffer”部分。这是可能的,因为使用的底层系统为同一家族的不同处理器提供了相同的功能。 但它必须是一个 PIMPL 来保证如果我更换到另一个供应商的不同处理器,我们可以为另一个供应商使用另一个 Impl。 因此,可能有人正在使用具有不同 DATA_SIZE 的部分,因为他在他的项目中以不同的方式定义了他的部分(即使在同一个处理器上)。 初始化和一切当然将通过构造函数等完成。
但是是否可以使 DATA_SIZE 可设置而不直接在 Impl-File 中定义?
据我所知,PIMPL 的目标是编译它并定义一个 ABI,这对我来说意味着编译后的文件在链接后不能改变大小。我的想法对吗? (对我来说,现在只是快速更改实现,并且永远不要接触上层使用 PIMPL 的软件部分,但将来我们将使用“pimpl-library”,我们只想更改编译后的 Impl-文件。)
我想阻止使用派生的基类/接口类来完全隐藏对开发人员的实现,并且不传递派生类的任何引用或指针,因为这需要在上层进行软件更改层。
感谢您的意见。
【问题讨论】:
-
您考虑过只使用#define 吗?
标签: c++ linker pimpl-idiom pimpl