c++ 그냥 문법 책떼고 간단한 프로그램 만들면서 노는 아이인데여,,,
소스코드 분석하다가 vector 템플릿을 너무 많이 써서 책에서는 무심코 지나쳤다가 그제서야 자세히 살펴본 라이브러리인데...
오늘은 valarray가 나왔네요 ,, 다시 레퍼런스 책 펴보니까...
책에 있는 내용에는
vector는 정렬 삽입 재배치 검색 다른 컨테이너로의 데이터 전송, 그 밖의 조작과 같은 켄테이너 지향적인 액티비티들 지원
valarray 클래스는 push_back() , insert() 메서드를 가지고 있지 않지만 많은 수학적인 연산에 대해 간단하고 직관적인 인터페이스 지원
이라고 되있는데 너무 실력이 허접해서 아리송하네요.
구글링 해봤는데 valarray는 빠르고 배열 핸들링이 효과적이지만 그리 잘짜여진 클래스가 아니라고 생각한다는 의견들이 많이보이는데...
블리츠 시스템(?) 에 관한 내용도 나오는데 영어 실력이 부족해서..
무조건 벡터를 쓰라고 권장하는게 요즘 Cpp추세. 그런데 벡터는 상대적으로 미치도록 느리기 때문에 성능 저하를 막기 위한 여러 꼼수들을 터득해야됨 - return 0;
std::valarray 는 그냥 std::array 에 수학함수들적용하기 편하게 래핑된건데, std::array 와 std::vector 의 차이를 아는게 중요하다고 봅니다.
컴파일 타임에 코드를 최적화할 수 있는건 std::array 기 때문에, 용도가 다른거지 무엇이 낫다 다르다를 논할수 없습니다.
아 감사합니다 . 커헉횽 , 코세횽 책에서 array , vector , valarray 비교 부분이 있는데 다시 살펴봐야겠습니다.
크기를 바꿀수 없는 array 의 상수적 특성이, 상수식을 계산해야 하는 경우에 무척 도움이 돼요.
가령 리터럴 문자열을 편집한다든지, 동적 할당이 아닌 배열 사용을 스마트하게 계산한다든지, 파라메터의 값이 특정될수 있고 그 룰을 상수로 표현할수 있는 경우에 최적화된 코드를 만들어내는데 쓰이죠.
즉, 컴파일 시점에서 필요한 정보들을 만들어내는데 std::array 가 중요하고,
런타임에서 자유롭게 사용하는데는 std::vector 가 편리한거죠.
성능적 측면은 당연히 vector 쪽이 불리할 수 밖에 없구요 : )
우와... 정말 감사드립니다 ㅠㅠ 글 삭제 안하고 남겨두겠습니다
한번에 정리됬습니다 정말 감사드려요 :D
헤헷 my pleasure. 두서 없이 말해도 뚝딱 알아들으시는듯.
그리고 덤으로, 런타임에서 일반 배열이나 버퍼 포인터같은 메모리 스트림을 STL 에 적용시켜주는 용도로 std::array 로 캐스팅할수 있기 때문에 좋아요.
valarray 는 수학 연산 하나 단위로 배열을 돌리는데 편리한거라 연관된 수식이 복잡할때 일일이 배열을 iteration 하는게 불리할 경우엔 효용이 떨어져서
많이 사용되진 않습니다.
특정 코딩 스타일을 지원하기 위해 편리한 정도죠.
그러니까 활용도가 높은것 위주로 삼촌이 포팅했다고 생각하면 됩니다.
대신 앞으로 최적화가 많이 진행되면, 배열의 각 요소에 대해 수학함수를 실행하고 그 결과가 나오는데( write back )까지 절차가 존재하니까
for( ... ) sin * cos * tan 하는 것 보다 for( ... ) sin, for( ... ) cos, for( ... ) tan 해서 합성하는쪽이 오히려 성능엔 유리한 경우가 있겠죠. 내부 병렬화를 추구하는 차원에서요.
( 외부병렬화에도 도움이 될 구조군요 : ) )
여기서 말하는 내부 병렬화는 컴퓨터 공학의 컴퓨터 아키텍쳐 에서 설명하는 파이프라인 과 스칼라 병렬화를 말하는거고
외부 병렬화는 멀티쓰레딩, GPGPU, 분산처리 에 해당하는거예유.
와.. 정말 열심히해야 겠네요 ㅠㅠ 시간내서 답글 달아주셔서 다시 한번 감사드립니다.