gpt4 book ai didi

c++ - 为什么 C 风格的代码比 C++ 风格的代码更快

转载 作者:行者123 更新时间:2023-11-30 21:45:34 25 4
gpt4 key购买 nike

在用C++实现算法问题后,我很好奇并用C编写了代码。

我意识到C实现本身有很多代码以及很多凌乱和不必要的部分。

对于 C++ 实现,速度为 8 毫秒,而 C 为 0 毫秒。

而我用C实现的代码长度更长,但大小只有C++文件大小的一半。

我很好奇有什么区别。请告诉我

C代码

#include <stddef.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>

#define MAX_LENGTH 1000
char *iterator;

bool assertNotNull(char* input) {
bool ret = true;

if (input == NULL)
ret = false;

return ret;
}

char *reverse(char *input) {
char head = *(input);
char *ret = (char*)malloc(sizeof(char)*MAX_LENGTH);
memset(ret, '\0', 1);

if (head == 'w' || head == 'b') {
char str[2] = { head , '\0' };
memcpy(ret, str, 2);
}

else {
char *leftTop = reverse(++iterator);
char *rightTop = reverse(++iterator);
char *leftBot = reverse(++iterator);
char *rightBot = reverse(++iterator);

char str[2] = { 'x','\0' };
memcpy(ret + strlen(ret), str, 2);
memcpy(ret + strlen(ret), leftBot, strlen(leftBot)+1);
memcpy(ret + strlen(ret), rightBot, strlen(rightBot)+1);
memcpy(ret + strlen(ret), leftTop, strlen(leftTop)+1);
memcpy(ret + strlen(ret), rightTop, strlen(rightTop)+1);

free(leftTop);
free(leftBot);
free(rightTop);
free(rightBot);
}

return ret;
}

int main() {
int caseNum;
char *input = (char*)malloc(sizeof(char)*(MAX_LENGTH));
char **ret = (char**)malloc(sizeof(char*)*MAX_LENGTH);

scanf("%d", &caseNum);

for (int i = 0; i < caseNum; i++) {
scanf("%s", input);
iterator = input;
*(ret + i) = (char*)malloc(strlen(input) + 1);
*(ret + i) = reverse(input);
}

for (int i = 0; i < caseNum; i++) {
printf("%s\n", *(ret + i));
}


return 0;
}

C++ 代码

#include <string>
#include <iostream>
#include <vector>
using namespace std;

string reverse(string::iterator &it) {
char head = *(it);
string ret = "";

if (head == 'w' || head == 'b') {
ret += head;
}

else {
string leftTop = reverse(++it);
string rightTop = reverse(++it);
string leftBot = reverse(++it);
string rightBot = reverse(++it);

ret += 'x' + leftBot + rightBot + leftTop + rightTop;
}

return ret;
}

int main() {
int caseNum;
string input;
vector<string> ret;

cin >> caseNum;

for (int i = 0; i < caseNum; i++) {
cin >> input;
string::iterator it = input.begin();
ret.push_back(reverse(it));
}

for (int i = 0; i < caseNum; i++) {
cout << ret[i] << endl;
}

return 0;
}

///

这是一个四叉树翻转的算法问题。 (https://algospot.com/judge/problem/read/QUADTREE)

示例输入为

4 // counts of case
w
xbwwb
xbwxwbbwb
xxwwwbxwxwbbbwwxxxwwbbbwwwwbb

示例输出为

w
xwbbw
xxbwwbbbw
xxwbxwwxbbwwbwbxwbwwxwwwxbbwb

和C代码执行时间:0msC++代码执行时间:8ms这个时间是根据算法问题站点(algospot)计算出来的。

我非常感谢所有的答案并让我意识到我的问题是错误的!!!

(对于英语不好,我深表歉意。:) )

最佳答案

不要强制冲洗:

cout << ret[i] << endl;

每次都强制流刷新,效率确实很低。而是简单地使用 \n;

cout << ret[i] << `\n';

此外,由于 C++ 试图保持与 C 的向后兼容性,因此 C++ iostream 链接到 C iostream。保持它们同步的成本很高。如果您没有在 C++ 应用程序中使用 C iostream,最好取消同步它们:

int main() {
std::ios::sync_with_stdio(false);

// Your code
}

像这样构建字符串并不是最有效的方法:

ret += 'x' + leftBot + rightBot + leftTop + rightTop;

做你在 C 中所做的事情:

ret += 'x';
ret += leftBot;
ret += rightBot;
ret += leftTop;
ret += rightTop;

您可能还想确保字符串的大小不会调整。在 C 版本中,您有最大尺寸。为什么不让 C++ 了解这一点以防止重新分配。

std::string ret;
ret.reserve(MAX_LENGTH);

关于c++ - 为什么 C 风格的代码比 C++ 风格的代码更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53777437/

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