如何使用inplace const char *作为std :: string内容

时间:2016-01-10 15:12:50

标签: c++ string flash c++11

我正在开发一个嵌入式SW项目。许多字符串存储在闪存中。我会将这些字符串(通常为const char*const wchar*)用作std::string的数据。这意味着我想避免因内存限制而创建原始数据的副本。

扩展使用可能是通过stringstream直接从闪存中读取闪存数据。

遗憾的是,示例不起作用:

const char* flash_adr = 0x00300000;
size_t length = 3000;
std::string str(flash_adr, length);

任何想法都将受到赞赏!

2 个答案:

答案 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)做了同样的工作,评论为我最喜欢的评论。

我对解决方案非常满意。它在性能方面表现良好,包括提供良好的可读性。