원시 이미지 데이터를 메모리 버퍼에 쓰는 프로그램에서 작업하고 있습니다. 현재 내 구현은 다음과 같습니다.이미지 표현을위한 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());
'_Screen'과 같이 밑줄 문자와 대문자로 시작하는 이름은 구현에 예약되어 있습니다. – imreal
@imreal 귀하의 우려에 고마워하지만 이것은 정말로 스타일 질문이 아니 었습니다. 우리가 사용하는 컨벤션은 private 멤버 변수를 가진 파스칼 케이스입니다. –
아래 답변에 대한 언급에서 언급했듯이 : "당신은 벡터로 성능을 잃을 것입니다 .C++에서 벡터의 모든 요소는 0/기본값으로 설정됩니다/NULL 때 크기 조정/할당. 일반 배열 들어,이 경우가 아닙니다. " – Brandon