Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以有效的方式传递字符串列表 #包括 #包括 #包括 void function1(常量字符**关键字){//C-like for(常量字符**关键字=关键字;*关键字;++关键字){ Std::CUT> P>这里的问题是C和C++编译器现在优化编译器…因为这两个函数都具有相同的可观察结果,并且在编译时可以猜到,编译器可以通过嵌入函数来实现函数2< /代码>与函数1相同。_C++_Performance_C++11 - Fatal编程技术网

以有效的方式传递字符串列表 #包括 #包括 #包括 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; 
}