c++ - 使用 std::array 的代码大小

标签 c++ c++11 embedded

我正在开发嵌入式系统(ARM Cortex-M0,所以没有 Linux)。我已经为嵌入式平台编写了很多 C 代码,但这是我第一次涉足 C++。

在我的 C 代码中,传递给函数的数组总是占用 2 个参数。一个用于指向数据的指针,第二个用于数组的长度。例如:

void write(uint8_t *buf, size_t bufLen, size_t writeLen);

我正在考虑将它们切换为使用 std::array(在 C++11 中引入)。它很有吸引力,因为它跟踪自己的长度但不进行任何分配。看起来等效于

template<size_t N> void write(array<uint8_t, N> *buf, size_t writeLen);

如果我的代码最终使用 10 个不同大小的数组调用 write,编译器是否最终定义了 10 个不同的函数?如果我定义一个接受两个(或更多)数组的函数,这似乎特别糟糕,因为该函数必须在 2 个参数(每个数组的大小)上进行模板化:

template<size_t N, size_t M>
void readWrite(array<uint8_t, N> *readBuf,
               array<uint8_t, M> *writeBuf, size_t writeLen);

最佳答案

如果 write() 代码在编译时了解 bufLen 没有太大好处,那么我看不出有任何改变它的意义。我将保留原始函数原型(prototype)并根据需要添加便利的包装器,如下所示:

template<size_t N>
void write(array<uint8_t, N> &buf, size_t count) {
    write(buf.data(), buf.size(), count);
}

您可以为不同的类似缓冲区的类型添加更多内容,例如 vector 字符串。在优化的构建中,所有这些包装器都将是微不足道的和内联的,因此没有代码重复,尽管在编译后仍然值得检查。

下一步是使用array_view这还不是标准的。但是您可以从某个地方借用实现或轻松制作自己的实现。有了它,您可以将主要功能定义为

void write(array_view<uint8_t>, size_t);

而且您甚至不需要任何包装器,因为 array_view 可以从 C 数组和各种容器隐式构造。

关于c++ - 使用 std::array 的代码大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29451518/

相关文章:

c++ - 如何获取 IWebBrowser2 的实例

c++ - 指向类的双指针

c++ - Variadic 可变模板模板,再次

c++ - 如何使用初始化列表构造 std::array 对象?

linux - 适用于嵌入式 Linux 板的轻量级数据库

c - sprintf 正在输出一些奇怪的数据

c++ - Valgrind——可能丢失警告

c++ - Boost:大图和多线程

c++ - 将 std::vector 分配给方法内的指针

c++ - 嵌入式编程开发板推荐