2014-11-07 2 views
1

C++에서 (스택에있는) 객체를 복사하려면 더 큰 객체를 복사하는 것이 더 느립니까? 즉시 복사 된 객체는, 또는 반복적 인 방법으로 복사 된 데이터의 바이트?큰 개체를 복사하는 것이 더 느립니다 (C++)?

class Small { 
public: 
    int stuff[32]; 
}; 

class Big { 
public: 
    int stuff[1024]; 
}; 

... 

Small small; 
Big big; 

Small small2 = Small(small); //Faster? 
Big big2 = Big(big); //Slower? 

미안하지만 지금 나는이를 테스트 할 시간이 없다.

답변

1

예, 크기가 큰 개체는 더 작은 개체보다 복사하거나 이동하는 데 더 많은 시간이 걸립니다.

32 개의 정수 배열은 복사하거나 이동할 32 개의 작업을 필요로합니다.
1024 개의 정수 배열은 복사하거나 이동할 1024 개의 작업을 필요로합니다.

질문은 시간의 차이가 중요한지 여부입니다. 최신 프로세서의 경우 대부분의 복사 작업은 나노초 수준입니다. 따라서 (대략) 1000 나노초가 프로그램에 영향을 미치게됩니까? 그것은 달려있다. 프로그램이 I/O를 기다리는 데 몇 밀리 초 이상 걸리는 경우 차이가 크지 않을 수 있습니다.

편집 1 :
복사하는 데 소요되는 공간보다 더 많은 공간이 필요할 수 있습니다.

큰 개체의 일반적인 경험 법칙은 개체를 앉아 포인터를 개체로 전달하는 것입니다. 큰 물체를 복사하거나 움직이지 마십시오. 포인터는 공간이 적어서 큰 개체보다 복사 및 이동이 빠릅니다. 또한 포인터에 대한 참조를 선호합니다.

편집 2 : - 스택으로 탑재 스택
복사는 프로세서와 컴파일러의 프로토콜에 따라 달라집니다. 스택이 필요하지 않습니다.

매개 변수와 로컬 변수 할당을 전달하기 위해 스택을 사용하는 고전적인 구현에서 오버 헤드는 객체를 복사 할뿐만 아니라 스택 포인터 변수를 증가시킵니다.

그래서 함수에 32 개의 정수를 전달하면 32 개의 복사 연산과 스택 포인터에 대한 덧셈 연산이 생깁니다.

일반적으로 큰 개체를 스택에 푸시 (복사)하는 데 필요한 시간보다 스택 공간이 더 중요합니다.

컴파일러는 최적화 수준 및 기타 특성에 따라 포인터로 개체를 전달할 수 있습니다.

+0

은 32 개의 정수로 구성된 배열이 128 개의 연산을 처리하고 1024 개의 연산이 4096 개의 연산을 처리하지 않을까요? – name

+0

'현대 프로세서의 경우 대부분의 복사 작업은 복사 또는 이동하기 전에 나노초 단위입니다. 필요한 메모리를 할당해야하며이 작업은 속도 저하의 원인이며 CPU가 수행 할 수 없습니다 그것에 대해 너무 많이; 당신은 초고속 CPU와 느린'malloc'을 가질 수 있으며,이 경우 느린 프로그램을 얻을 수 있습니다. – user2485710

+0

@name "operation"은 클럭주기와 같은 구체적인 단위가 아닌 일반 용어로 사용됩니다. –

1

복사해야하는 바이트가 많을수록 오래 걸릴 것입니다. 이것이 전반적인 성과에 중요한지 여부는 다른 문제입니다. 실제 킬러는 사본에 동적 메모리 할당이 필요한 경우입니다. 바이트의 직선 복사본은 일반적으로 스택이나 힙 (대상 메모리가 이미 할당되어있는 한)에서 나쁘지 않습니다. 큰 배열을 스택에 두는 것을주의하십시오.

+0

일반적으로 임시 값을 제외하고는 스택을 전혀 사용하지 않고 나머지는 힙에 머물러 있습니다. – name

+0

@name Stack은 힙보다 빠르기 때문에 임시 변수가 의미하는 바라면 지역 변수에 유용합니다. –

+0

그래, 나는 힙 할당을 낮게 유지하려고 노력하고, 임시 값에 의해 나는 지역 변수를 의미했다. – name

1

더 큰 개체는 복사하는 데 시간이 오래 걸리는 것이 아니라 복사 작업이 필요합니다.

char [4096] ; 

을 복사

은 일반적으로 더 오래 걸릴 수있는 다른 일이있다, 그러나
char [32] ; 

을 복사하는 것보다 더 오래 걸립니다. 생성자 및 대입 연산자를 복사하면 다른 처리가 많이 필요하므로 종종 데이터를 이동하는 것보다 훨씬 계산 집약적입니다.

32 개의 정수 배열을 복사하는 것이 반드시 32 개의 명령어를 의미하는 것은 아닙니다. 일부 프로세서에는 블록 이동 명령이 있습니다. 그러나 한 블록 이동 명령은 여러 사이클을 실행하는 데 사용할 수 있습니다.

0

은 반드시 그렇지,하지만 분명히 더 큰 목적은 ... 이상이 경우는 복사의 오버 헤드가 더 중요했다 데이터를 이동해야하기 때문에 소요

예를 들어, 더 많은 것을 의미한다.

Big b1; 
Big b2 = b1; 

는 빨리 사본이 메모리를 할당 할 수 정말 신속하고 복사 그냥 일반적으로 전문적인 지침의 최적화 된 버스트 데이터를 복사하는 빠른 CPU 명령의 집합입니다 스택 스택 것입니다.

Small s1; 
Small* s2 = new Small(s1); 
비교적 빠른 속도는 아니지만 상대적으로 비싼 힙에 메모리를 할당 한 다음 데이터를 복사해야합니다. 빅 객체가 정말 크다면 분명히 메모리 복사와 할당이 앞의 예제보다 더 저렴할 것입니다. (그리고 그 점이 무엇인지 말할 수 없습니다. 힙 조각화, 힙 구현에 달려 있습니다. 풀은 더 빨라지고 스택 복사를 수행하는 데 걸리는 시간).

개체에는 하나의 바이트 배열이있을 수 있지만 대부분의 개체에는 더 많은 멤버 변수가 있고 각 개체를 개별적으로 처리하기위한 복사 매개 변수가 있으며 일부에는 특수한 루틴이 있습니다 복사를 로깅하거나 병렬로 액세스 할 수없는 공유 자원을 잠그는 것과 같이 사본을 수행하는 데 필요한 자원입니다.

관련 문제