gpt4 book ai didi

c++ - 将格式化的 char 数组发送到 ostream 而无需额外的内存复制

转载 作者:太空狗 更新时间:2023-10-29 21:41:34 25 4
gpt4 key购买 nike

我需要向 ostream 发送一个字符数组。假设我有以下打印功能:

版本 1:

void print(ostream &out, const char *str, unsigned len)
{
out << string(str,len);
}

版本 2:

void print(ostream &out, const char *str, unsigned len)
{
out.write(str,len);
}

以上两个版本都在一定程度上起作用。版本 1 看起来效率较低,因为它会创建一个额外的字符串对象(导致内存分配和数据复制)。

然而,版本 2 消除了格式化的可能性。在下面的示例中,版本 1 效果很好(这意味着 io 操纵器成功地将宽度设置为 10 并将其应用于下一个输出字段):

out << setw(10);
print(out,s,slen);

有没有办法保留 V1 中的功能,但无需为分配/内存复制支付额外费用?

最佳答案

没有简单或合理的方法可以做到这一点。

根本问题是 operator<<(basic_ostream<charT, ...>&, basic_string<charT, ...>)被定义为行为等同于 operator<<(basic_ostream<charT, ...>&, const charT*) , 它通过 basic_ostream<charT, ...>::traits_type::length(str) 计算要写入的字符数.无法使用此接口(interface)传递长度。

如果可以重写取char*而不是 const char* , 你可以暂时将其中一个字符设置为 NULL在调用格式化输出运算符之前,然后将其重置为原始值。

有人建议添加basic_string_view ,它可以满足您的需求,但它未包含在 C++14 中。

关于c++ - 将格式化的 char 数组发送到 ostream 而无需额外的内存复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28593791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com