【发布时间】:2017-05-23 13:10:01
【问题描述】:
简介
我正在开发我的第一个嵌入式应用程序(在 Arduino 上),它从许多现成的组件中获取输入并控制它们。这是一个完全私人的非商业项目。 (只是为了我自己的利益而做一些有趣的/训练练习。)
Arduino 库只是 C++ 源代码的压缩集合,其中包含一个 C++ 和 .h 文件,用于呈现库的接口。就这个问题而言,只需将每个库视为我从其他人那里获得的资源集合。
可以使用免费提供的库(具有良好声誉)来控制两个更复杂的组件,我希望使用这些库来避免重新发明轮子。但是,这两个库都声明了许多数组,这些数组占用了非常有限的可用数据空间。
在启动时,我的应用程序将测试一个开关,该开关将确定在下一次电源循环之前将使用两个组件中的哪一个。我永远不会同时使用这两个组件。
我的问题是什么?
我想更改库以共享 RAM 中的相同空间,但我发现我对 C++ 的了解太有限了。
现有代码是什么样的?
库 A 声明一个缓冲区如下:
class A
{
public:
char name[50];
char address[100];
}
库 B 声明一个缓冲区如下:
class B
{
public:
static char name[];
static char address[];
}
并且B的调用者需要定义缓冲区如下:
char B::name[50];
char B::address[100];
可能的选择
我可以轻松地对库 A 进行少量更改,以传递指向由我的应用程序定义的缓冲区的指针。但是,库 B 比较棘手,因为缓冲区被声明为静态并由许多静态方法使用。
我可以更改库 B 以将所有使用这些缓冲区的静态方法转换为非静态方法。但这将是一项重要的工作,并且会偏离我想要的更多内容。如果有一天我想,这样的更改会使我更难更新我的应用程序以使用原作者的更高版本的库。
我假设我可以将 B:name[] 和 B::address[] 的地址传递给库 A,但是将 B 类的缓冲区传递给 A 类感觉就像一个粗略的障碍。
考虑到硬件环境,我不介意定义一个足够大的缓冲区来存储名称和地址,然后在库中对缓冲区使用偏移量。但我的主要问题阻止我在图书馆 B 中这样做。
问题
总而言之,我的问题是我不能让两个库共享一个完全在两个类之外定义的缓冲区,而不更改库 B 以便它不使用静态方法。
任何人都可以提出任何语言技巧来巧妙地解决我的问题,只需进行少量代码更改或可以自动或使用宏进行的更改吗?
【问题讨论】:
-
您可以使用指针或对缓冲区的引用。然后他们共享同一个空间。
-
“诀窍”是使用指针和 new/delete[] 作为 B 的调用者
-
@Ðаn 我会考虑使用
constexpr std::string_view,将其全部移动到只读段中可以很容易地共享内存。唯一需要注意的是整个事情必须是constexpr。 -
@Ðаn : Arduino 是一种小型嵌入式设备。
string的开销可能大得不合理。