Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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
C#和C++; 我在C++和C语言中有两个非常简单的代码。 在c中# for(int计数器=0;计数器_C#_C++_String - Fatal编程技术网

C#和C++; 我在C++和C语言中有两个非常简单的代码。 在c中# for(int计数器=0;计数器

C#和C++; 我在C++和C语言中有两个非常简单的代码。 在c中# for(int计数器=0;计数器,c#,c++,string,C#,C++,String,在c中++ for (int counter = 0; counter < 100000; counter ++) { string a = ""; a.append("xyz"); a = a + 'd'; a = a + 'c'; a = a + 'h'; } for(int计数器=0;计数器 这可能是实现的一个怪癖。例如,一个优化器可能已经发现没有使用操作的结果。或者,一个可能碰巧分配了一个足够大的字符串来添加三个额外的字符,而另一个没有。也

在c中++

for (int counter = 0; counter < 100000; counter ++)
{
    string a = "";
    a.append("xyz");
    a = a + 'd';
    a = a + 'c';
    a = a + 'h';
}
for(int计数器=0;计数器<100000;计数器++)
{
字符串a=“”;
a、 附加(“xyz”);
a=a+‘d’;
a=a+‘c’;
a=a+‘h’;
}
奇怪的是,C代码比C++代码花了1/20倍的时间执行。
你能帮我找出这件事发生的原因吗?我怎样才能改变我的C++代码以更快地运行。p> 这可能是实现的一个怪癖。例如,一个优化器可能已经发现没有使用操作的结果。或者,一个可能碰巧分配了一个足够大的字符串来添加三个额外的字符,而另一个没有。也可能是一百万件其他的事情

用“玩具”代码进行基准测试真的没有帮助。我不认为结果适用于任何现实情况

此代码有许多明显的优化,例如:

string a;
for (int counter = 0; counter < 100000; counter ++)
{
    a = "xyz";
    a.append(1, 'd');
    a.append(1, 'c');
    a.append(1, 'h');
}
字符串a;
用于(整数计数器=0;计数器<100000;计数器++)
{
a=“xyz”;
a、 附加(1,'d');
a、 附加(1,'c');
a、 附加(1,'h');
}

通过重用缓冲区和避免额外的分配/复制/释放周期,这可能会产生巨大的差异。

对于大型字符串操作,使用的是我还是
a=“xyz”
a.append(“xyz”)
在语义上不等价?它们是不同的,但当a=“”它们工作相同时。@MasoudHabibi-结果是相同的,但是我很确定实现是完全不同的(而且很可能
append
operator=
慢)。尝试使用
操作符=
。还有,如何编译代码?都是使用visual studio 2010编译器编译的。在C++中写一个A=“XYZ”是不可能的。它给了我一个机会error@MasoudHabibi:它应该起作用,是按原样定义的。这是一个真实的案例。这是一个很长的代码,所以我做了一个简短的介绍,并复制到这里。我认为C++字符串和C字符串之间应该有区别。我想用C++更快地处理字符串。应该有可能以某种方式做到这一点。因为C++中的代码如果写得好,至少应该有与C语言代码相同的速度,但是这段代码远远没有写出好的代码。永远不要使用
a=a+x因为这需要创建一个额外的分配/复制/自由循环来保存<代码> A+X。请给我一分钟时间试试看。我在VC++中有同样的效率问题。你能帮帮我吗。正如我在互联网上读到的那样,这似乎是一个分配/复制/免费的循环。没有这些,有什么方法可以推动吗?@Masoudhabi:没有一种方法是正确的。这取决于实际代码。在向量中默认构造对象,然后执行
std::swap(myVector[index],myObject)可能更便宜
或者最好在向量中默认构造对象,然后执行
myVector[index]=myObject
。或者,
push_back
可能是最好的选择。你必须看看具体情况。(但百分之九十九的情况下,没有必要在现实的程序中对此进行优化。)
string a;
for (int counter = 0; counter < 100000; counter ++)
{
    a = "xyz";
    a.append(1, 'd');
    a.append(1, 'c');
    a.append(1, 'h');
}