Atercatus
42
2018-12-14 02:12:43
4
905

c 와 c++의 파일 크기와 속도에 대해서 궁금합니다.


안녕하세요 프로그래밍 공부를 하고 있는 대학생입니다.


알고리즘 문제를 C++로 구현 한 뒤 호기심이 생겨서 C로 코딩을 해봤습니다.

C로 구현한 쪽이 스스로 느끼기에 코드도 더 길고 난잡하고 불필요한 부분이 많이 있다고 생각했는데 

C++로 구현한 쪽이 속도가 8ms가 나왔고 C는 0ms가 나왔습니다.

그리고 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;
}


0
  • 답변 4

  • cbs0615
    3
    2018-12-14 03:25:12

    입력에서 그런게 아닐까욤?? 저도 같은 학생이라 잘은 모르지만

    c++ 에서 endl;을 쓰면 버퍼 플러쉬를 해서 IO동작이 C코드보다 빈번해져서 

    그런거 같은데...

  • 인그니야
    1k
    2018-12-14 09:06:55

    C++의 표현식은 겉보기엔 간단하게 보여도 실제로는 더 많은 수의 C코드를 함축시킨 것과 같은 걸로 알고 있습니다. 이로 인해 그런 것이 아닐까 합니다.

  • 와이즈번
    84
    2018-12-14 09:58:40

    char* 와 string class 차이만해도 어마무시하죠.

  • 로직X
    552
    2018-12-14 10:23:04

    쉽게 말해보면...

    인간이 더 못알아 먹을수록, 더 쓰기 어려울수록 기계가 빨리 이해한다

    정도가 되지 않을까요. 고급언어로 갈수록 사람이 이해하긴 쉽지만 그안에 함축된 코드들의 양이 늘어나죠.

  • 로그인을 하시면 답변을 등록할 수 있습니다.