我们有以下情况:我们正在使用在其 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-文件。)
我想防止使用派生的基类/接口类来完全隐藏对开发人员的实现,并且不传递派生类的任何引用或指针,因为这需要在上层进行软件更改。
谢谢你的想法。