2014-07-23 4 views
0

원시 이미지 데이터를 메모리 버퍼에 쓰는 프로그램에서 작업하고 있습니다. 현재 내 구현은 다음과 같습니다.이미지 표현을위한 C++ 컨테이너 성능

std::unique_ptr<unsigned char[]> _Screen; 
... 
_Screen.reset(new unsigned char[width * height * 3]); 
std::fill(_Screen.get(), _Screen.get() + (width * height), 0); 
... 
_Screen[(j * _ScreenWidth + i) * 3] = red; 
_Screen[(j * _ScreenWidth + i) * 3 + 1] = green; 
_Screen[(j * _ScreenWidth + i) * 3 + 2] = blue; 

가능한 경우 여기에 STL 컨테이너를 사용하고 싶습니다. 런타임까지 화면의 크기를 알지 못하므로 std::array이 종료되었습니다. 다음과 같이 std::vector<unsigned char>를 사용하여 화면을 다시 정의 할 수 있어야한다 :

std::vector<unsigned char> _Screen 
... 
_Screen.resize(width * height * 3); 

을하지만 요소 액세스는 C 스타일 배열을 사용하여보다 느린 것인지 궁금? (나는 재 할당이 더 느릴 것이라고 가정하지만이 응용 프로그램에서는 괜찮습니다.)

는 다음과 같이 할 수있는 더 의미 할 것인지 나도 궁금

:

struct Pixel 
{ 
    unsigned char red; 
    unsigned char green; 
    unsigned char blue; 
}; 
... 
std::vector<Pixel> _Screen; 
... 
_Screen.resize(width * height); 
... 
_Screen[(j * _ScreenWidth + i)].red = red; 
_Screen[(j * _ScreenWidth + i)].green = green; 
_Screen[(j * _ScreenWidth + i)].blue = blue;  

그러나이 데이터가 더 나은 나타낸다 그래서 결국 unsigned char의 단일 배열로 변환 할 필요 하겠어을 계산 과정에서 얼마나 어려운지 확신 할 수 없습니다.

unsigned char *screen = reinterpret_cast<unsigned char *>(_Screen.data()); 
+2

'_Screen'과 같이 밑줄 문자와 대문자로 시작하는 이름은 구현에 예약되어 있습니다. – imreal

+0

@imreal 귀하의 우려에 고마워하지만 이것은 정말로 스타일 질문이 아니 었습니다. 우리가 사용하는 컨벤션은 private 멤버 변수를 가진 파스칼 케이스입니다. –

+1

아래 답변에 대한 언급에서 언급했듯이 : "당신은 벡터로 성능을 잃을 것입니다 .C++에서 벡터의 모든 요소는 0/기본값으로 설정됩니다/NULL 때 크기 조정/할당. 일반 배열 들어,이 경우가 아닙니다. " – Brandon

답변

1

표준 : : 벡터 그냥 블록의 할당을 관리, 이미 기본적으로 C 스타일 배열 다음 struct 접근 방식은 어떤 속도가 느려질 수 사용하고 것인가하는 것은 안전 나중에 같은 것을 사용하여 unsigned char로 변환하는 것입니다. 벡터의 크기를 초기화하면 크기를 한 번 할당 한 다음 원하는 경우 내부 배열 버퍼에 액세스하여 데이터를 직접 처리하거나 오버로드 된 대괄호 연산자를 사용할 수 있습니다. 결국, 나는 당신이 이것을하는 것으로 눈에 띄는 성과를 잃지 않을 것이라고 생각하지 않습니다. 그것은 당신에게 좋게 보이는 것까지입니다.

두 번째 질문에 대해서는 합병증을 피하기 위해 첫 번째 반복을 계속하는 것이 좋습니다. 그러나 Pixel 구조체가 단순히 3 개의 unsigned char 인 경우 memory-wise는 이미 3 개의 uchar 배열과 동일한 형식이므로 거의 차이가 없으므로 전체 메모리 블록 char을 char 단위로 반복하여 넣을 수 있습니다. 다시 이미지로, 그리고 그 반대의 경우도 마찬가지입니다.

+0

감사합니다. 이것이 내가 생각하고있는 것이지만 내가 원했던 것입니다. 다른 사람들이 그걸로 가기 전에 생각한 것을보기 위해 나는 벡터 구현 –

+1

을 사용할 것입니다. 벡터로 인해 성능이 떨어질 것입니다. C++에서 벡터의 모든 요소는 크기 조정/할당시 0/default/NULL로 설정됩니다. 일반 배열의 경우에는 그렇지 않습니다. – Brandon

+1

그러나 벡터는 한 번만 크기가 조정되기 때문에 결국에는 차이를 만들기에 충분한 성능 손실을 고려하지 않습니다. – Lochemage

관련 문제