使用矢量作为输出缓冲区



我在Base64中编码了大量数据(>1MB(。

我找到了一个很好的图书馆,它可以帮助我尽快处理这个问题。

它的解码语法在这里,非常基本,它需要一个输出缓冲区:

int base64_decode
    ( const char  *src
    , size_t       srclen
    , char        *out
    , size_t      *outlen
    , int          flags
    ) ;

尽管我可以从他们的样本中获得输出缓冲区:

char out[1*1024*1024];

但是输入大小是而不是常量,而且在编译时要求这么大的大小看起来和感觉都不太好。另一方面,与堆(源(上存储和访问的数据相比,在堆栈上有一个不错的大缓冲区会带来一些速度优势。

但我想到了使用vector<char>。我可以把它定义为

std::vector<char> out;

然后当我有输入大小时,我可以resize它:

out.resize(input_size);

调整大小会将其所有项初始化为0,这对我来说似乎不切实际,也没有必要,因为base64_decode也会在下一步初始化这些项。

因此,resize可能不是最好的,但调用reserve也没有帮助,因为它不会修改向量的大小(尽管它也不会初始化项(。

由于我之前没有关于数据大小的信息,我要么需要使用一些运行时可调整大小的缓冲区,要么进行重大猜测并分配一个巨大的缓冲区。

由于该库能够非常快速地解码,我也希望对输出缓冲区使用最快的解决方案,而char arrayvector似乎都不合适。那我最快的选择是什么?

堆栈分配确实比堆分配快得多,但(1(您可能没有1MB的堆栈,更重要的是(2(解码1MB的Base-64文本比分配本身花费更多的时间,即使使用快速库也是如此。

请注意,如果四舍五入,Base-64解码正是4:3的比例。因此,如果您知道srclen,那么(srclen+3)/4*3就是必需的outlen。它之所以是out参数,主要原因是为了取整——实际长度可能短一个字节。

最新更新