我正在开发一个嵌入式SW项目。许多字符串存储在闪存中。我会将这些字符串(通常为const char*
或const wchar*
)用作std::string
的数据。这意味着我想避免因内存限制而创建原始数据的副本。
扩展使用可能是通过stringstream直接从闪存中读取闪存数据。
遗憾的是,示例不起作用:
const char* flash_adr = 0x00300000;
size_t length = 3000;
std::string str(flash_adr, length);
任何想法都将受到赞赏!
答案 0 :(得分:0)
如果您愿意使用编译器和库特定的实现,这里有一个适用于MSVC 2013的示例。
#include <iostream>
#include <string>
int main() {
std::string str("A std::string with a larger length than yours");
char *flash_adr = "Your source from the flash";
char *reset_adr = str._Bx._Ptr; // Keep the old address around
// Change the inner buffer
(char*)str._Bx._Ptr = flash_adr;
std::cout << str << std::endl;
// Reset the pointer or the program will crash
(char*)str._Bx._Ptr = reset_adr;
return 0;
}
它将打印Your source from the flash
。
这个想法是保留一个std :: string,它能够使你的flash中的字符串适应并继续改变它的内部缓冲区指针。
您需要为编译器自定义它,并且一如既往,您需要非常小心。
答案 1 :(得分:0)
我现在使用了CPP核心指南(https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md)中描述的string_span。 GSL提供了完整的实施(GSL:指南支持库https://github.com/Microsoft/GSL)。
如果您知道闪存内的字符串的地址,您可以直接使用以下构造函数的地址来创建string_span。
constexpr basic_string_span(pointer ptr, size_type length) noexcept
: span_(ptr, length)
{}
std :: string_view可能与Captain Obvlious(https://stackoverflow.com/users/845568/captain-obvlious)做了同样的工作,评论为我最喜欢的评论。
我对解决方案非常满意。它在性能方面表现良好,包括提供良好的可读性。