2014-06-15 3 views
3

C++에서는 항상 C 스타일 배열보다 std::array을 사용해야한다고 들었습니다.std :: array over C 스타일 배열

질문을보고 나서 std :: array가 더 좋다는 사람들을 보았습니다.

그런 의미에서 나는 std::array을 많이 사용했고 때로는 다른 라이브러리를 사용할 때 C 스타일 배열을 사용하는 메서드를 사용해야합니다.

예를 들어, 나는이 기능

void Draw(float* arg); 

함께 일하고 그것은 매개 변수로 std::array<float,4>를 전달 할 수 있습니까?

& vec4 [0]을 매개 변수로 전달하면 정의되지 않은 동작이 발생합니까?

그런 의미에서 다차원 배열에서도 마찬가지입니까? 이 배열

내가 & mtx4 전달한다면 또한 정의되지 않은 동작이있을 것이다

std::array<std::array<float,4>,4>; 

선언 [0] [0]이 파라미터는?

편집 : 다차원 배열에 대한 코드에서 내 오류를 지적 해 주셔서 감사합니다. 나는 그것을 편집했다.

+3

'std :: array'는 멤버로 배열을 가지고 있습니다. 그 배열은 다른 배열과 같은 역할을합니다. 그러나'.data()'를 대신 사용해보십시오. 그리고 "다차원 배열"예제는 일반 배열에서도 작동하지 않습니다. 2D'std :: array'에서 어떤 마법도 기대하지 마십시오. – chris

+2

_ "매개 변수로'std :: array '을 전달할 수 있습니까?"_ ** 예! **'Draw (my_cpp_array.data());'. 너는 많은 질문을하고있어, 그래서 나는 고갈되고있다. :) –

+1

'std :: array'에 대한 좋은 점 중 하나는 데이터에 접근하기 위해'at()'메소드를 사용하면 경계 체크를 할 것이고 따라서 유명한 하나씩의 문제로부터 당신을 구할 수 있다는 것입니다 버그, 원시 배열에서 항상 easly 검색되지 않습니다. http://en.wikipedia.org/wiki/Off-by-one_error – glampert

답변

0

std :: array를 매개 변수로 전달할 수 있습니까?

예. 정확한 구문은 다음 I 매개 변수로서 & vec4 [0]에 전달한다면

Draw(my_array.data()); 

는 정의되지 않은 동작이있을 것인가?

아니요 구문 상으로는 의도를 명확하게하지 못하는 편이지만 의미 상 동일합니다.

그런 의미에서 다차원 배열에서도 마찬가지입니까?

예, 색인 정보와 관련된 평면 배열 인 고전적인 C 다차원 배열을 의미하는 경우 예. 아니요, C 배열 배열을 뜻한다면.

float array2d[5][5]; // ok 
float *array2d[5]; // not ok 
std::array<std::array<float,5>,5> array2d; // not ok 

첫 번째에는 연속 저장이 있습니다. 다른 두 가지는 배열에 대한 포인터의 배열이며 다르게 처리되어야합니다. 방법을 추천하기에 충분하지 않습니다.


다차원 배열의 다른/새로운 구문에 대한 참조 here이 발견되었습니다. 연속적인 저장 영역을 제공해야합니다.

std::array<float,5,5>; // should be ok 

이 구문의 상태는 실제로 알 수 없습니다. 아마도 다른 사람들이 도움을 줄 수 있습니다.이 선언의 일부 추가 조사 후


:

std::array<std::array<float,5>,5> array2d; 

여기 array2d의 스토리지 관련없는 포인터, 모든 인라인 (in-line)이다. 내가 저장을 조사 할 수 있었다 모든 경우에 메모리 레이아웃이

float array2d[5][5]; 

이 표준의 요구 사항은 아닙니다과 동일하도록, 연속 것으로 보인다. 일치하는 구현은 일부 T에 대해 이 sizeof(T[])보다 큰 추가 정보 또는 패딩을 삽입 할 수 있습니다. 그렇다면이 두 가지에 대한 저장 레이아웃은 동일하지 않습니다.

+0

당신이 옳다고 가정하면 나중의 질문에 대한 훌륭한 대답입니다. –

+1

@DrewDormann : 감사합니다. 공정한 의견입니다. 나는 OP에 대한 좋은 대답을하려고 노력하며 대개 나는 그 (것)들을 맞는다, 그러나 때때로 commenter는 과실을 찾아 내 대답을 편집해야한다. 그래서 요점은 _ 많은 사람들이 체크하기 때문에 답변이 높은 품질이라는 것입니다. –

+4

마지막 요점이 무엇을 의미하는지 모르겠지만'std :: array'의'std :: array'는 연속적인 저장 공간을 가지고 있습니다. 고전적인 C 다차원 배열과 같습니다. – juanchopanza

관련 문제