以有效的方式传递字符串列表 #包括 #包括 #包括 void function1(常量字符**关键字){//C-like for(常量字符**关键字=关键字;*关键字;++关键字){ Std::CUT> P>这里的问题是C和C++编译器现在优化编译器…因为这两个函数都具有相同的可观察结果,并且在编译时可以猜到,编译器可以通过嵌入函数来实现函数2< /代码>与函数1相同。
即使它没有内联函数,也可以在编译时准备向量,从而节省大量的模板构造 但是,如果您想在多个系统上使用代码,那么您就陷入了一个黑暗的境地:您无法确定特定编译器将如何翻译它以有效的方式传递字符串列表 #包括 #包括 #包括 void function1(常量字符**关键字){//C-like for(常量字符**关键字=关键字;*关键字;++关键字){ Std::CUT> P>这里的问题是C和C++编译器现在优化编译器…因为这两个函数都具有相同的可观察结果,并且在编译时可以猜到,编译器可以通过嵌入函数来实现函数2< /代码>与函数1相同。,c++,performance,c++11,C++,Performance,C++11,即使它没有内联函数,也可以在编译时准备向量,从而节省大量的模板构造 但是,如果您想在多个系统上使用代码,那么您就陷入了一个黑暗的境地:您无法确定特定编译器将如何翻译它 因此,对于低级别优化,您遵循的通常规则是:从语言的角度来看,这并没有真正意义,但仅适用于具有特定配置(编译和链接选项)的特定实现。然后,唯一可靠的方法是读取汇编代码并对不同版本的代码进行基准测试。如果可以选择C++17 有一个新类正是您想要的 void function1(const char** keywords = nullp
因此,对于低级别优化,您遵循的通常规则是:从语言的角度来看,这并没有真正意义,但仅适用于具有特定配置(编译和链接选项)的特定实现。然后,唯一可靠的方法是读取汇编代码并对不同版本的代码进行基准测试。如果可以选择C++17 有一个新类正是您想要的
void function1(const char** keywords = nullptr)
void function2(const std::vector<std::string>& keywords = {})
void函数2(const std::vector和关键字){//C++17
for(自动常量和关键字:关键字){
std::cout有两个困难:
const char*
与std::string
(甚至是C++17中的std::string\u视图
)
以及上述类型的集合
由于容器
,容器
和容器
是不同的类型,需要转换才能从一个传递到另一个
为了避免这些困难,您可以使用模板:
void function2(const std::vector<std::string_view>& keywords) { // C++17
for(auto const& keyword : keywords) {
std::cout << keyword << std::endl;
}
}
as{/*..*/}
没有类型。它可以匹配C数组或初始值设定项列表
模板
因此,您可以添加额外的重载来处理这种情况:
function3({ "hello", "world", "!" });
谢谢您的回复。基于@Jarod42回复,我实现了我自己的类似回复
template <typename String = std::string>
void function3(std::initializer_list<String> keywords = {}) {
return function3<std::initializer_list<String>>(keywords);
}
模板
void函数(constStringContainer&keywords={}){
如果(!keywords.size()){
返回;
}
for(常量自动和关键字:关键字){
std::cout在function2
@Galik中没有动态分配,但在构造参数时有动态分配。向量内部缓冲区。可能还有字符串,具体取决于实现。当将一组字符串打印到std::cout
-或任何物理流(如磁盘上的文件)时,性能是一个次要问题。后期在如何构造参数以传递给函数或循环本身的过程中,I/O的不确定性将远远大于您可以实现的任何潜在性能增益。请阅读“过早优化”的概念“@juanchopanza但在fuction2
中没有发生任何情况。您可以使用预先构造的向量调用该函数。这是实际代码中更可能出现的情况。void function3(std::initializer\u list关键字)
以避免分配。(但是string\u view
是C++17)如果OP已经有一个向量
,这是非常低效的。每当我看到一个std::vector常量&
,我想知道为什么它不是一个std::span
@Deduplicator,我不知道std::span类(C++20)。谢谢你的评论
function3({ "hello", "world", "!" });
template <typename String>
void function3(std::initializer_list<String> keywords) {
return function3<std::initializer_list<String>>(keywords);
}
template <typename String = std::string>
void function3(std::initializer_list<String> keywords = {}) {
return function3<std::initializer_list<String>>(keywords);
}
template <typename StringContainer = std::initializer_list<const char*>>
void function(const StringContainer& keywords = {}) {
if (!keywords.size()) {
return;
}
for (const auto& keyword : keywords) {
std::cout << keyword << std::endl;
}
}
int main() {
function();
function({ "hello", "world", "!" });
std::vector<std::string> keys = { "hello", "world", "!" };
function(keys);
return 0;
}