寻找一种将 PIMPL 与外部常量定义一起用于实现内部数组大小的方法
Finding a way to use PIMPL with external constant definitions for the size of an array inside the implementation
我们遇到以下情况:我们使用的处理器在其 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-文件。)
我想阻止使用您从中派生的 Base-/Interface-Class 来完全向开发人员隐藏实现,并且不传递派生 class 的任何引用或指针,因为这将需要一个上层的软件更改。
谢谢你的想法。
But is it possible to make the DATA_SIZE settable and not to define it directly in the Impl-File?
必须在 class 定义中设置非静态成员数组的大小。
您可以使用预处理器包含来自其他地方的值,因此它不必在这个意义上“在文件中”,但无论大小是多少,它都必须在所有 TU 和更改中匹配仅在私有实现内部的大小而不修改接口的客户端是不可能的..
请注意,只要您将数组定义为至少是指针的大小和对齐方式,那么您就可以使用间接在私有实现中拥有任何数据 - 通过存储指针并动态创建具体对象存储。
我们遇到以下情况:我们使用的处理器在其 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-文件。)
我想阻止使用您从中派生的 Base-/Interface-Class 来完全向开发人员隐藏实现,并且不传递派生 class 的任何引用或指针,因为这将需要一个上层的软件更改。
谢谢你的想法。
But is it possible to make the DATA_SIZE settable and not to define it directly in the Impl-File?
必须在 class 定义中设置非静态成员数组的大小。
您可以使用预处理器包含来自其他地方的值,因此它不必在这个意义上“在文件中”,但无论大小是多少,它都必须在所有 TU 和更改中匹配仅在私有实现内部的大小而不修改接口的客户端是不可能的..
请注意,只要您将数组定义为至少是指针的大小和对齐方式,那么您就可以使用间接在私有实现中拥有任何数据 - 通过存储指针并动态创建具体对象存储。