2016-09-17 3 views
16

std::array<int,10> (나 자신을 사용하지 않고 new)은 C++ 표준에 의한 힙 대신 스택에 할당되도록 보장됩니까?std :: array <>는 스택에서만 할당을 보장합니까?

분명히 말해서, 나는 new std::array<int, 10>을 의미하지 않습니다. 표준 라이브러리가 구현 내에서 new을 사용할 수 있다면 나는 주로 궁금해합니다.

답변

11
내가 표준에서 더 명시 적으로 답을 찾을 수 없습니다

하지만 [array.overview]/2 :

배열은 총 ([dcl.init.aggr]) 목록 초기화 그 유형 전환이 최대 N 요소가 될 수있다 T.

그리고 [dcl.init.aggr]/1 :

집계 배열 또는 클래스 (조 [class])

  • 함께에는 사용자가 제공 명시하거나 상속 생성자 ([class.ctor]),

... 약을 덮는

. 결코 집계가 동적으로 메모리를 할당 할 수는 없습니다 (또는 건설 중에는 자체적으로 모든 작업을 수행 할 수는 없습니다). 암묵적으로 선언 된 간단한 생성자 만 있습니다.

물론 new std::array<...> 인 경우 "힙"에 배열이 표시됩니다.


일부는 우리가 cppreference에 얻을 수있는 더욱 만족하실 수 있습니다

std::array는 고정 된 크기의 배열을 캡슐화하는 컨테이너입니다.

이 컨테이너는 비 정적 데이터 멤버로 C 스타일 배열 T[N]을 보유하는 구조체와 동일한 의미를 갖는 집계 유형입니다.


셋째, std::array는 C++ (11)에 도입 하였다. 왜? 예를 들어, 어떤 식 으로든 std::vector을 보완하려면 동적 할당이 허용되지 않는 constexpr 함수의 사용법을 좋아합니다.

+2

+1 즉,'template 구조체 배열 {T elems [N]; };'w.r.t. layout ('elems'는 실제로 존재하지 않습니다). – GManNickG

+4

@towi : C++에는 실제로 스택이나 힙 개념이 없습니다. 보통 우리는 당신이 의미하는 것을 얻지 만, 당신은 "C++ 표준에 의해"물었습니다. 위에 주어진 예제와 동일한 보증을받습니다. 이것이 어떻게 할당되는지는 구현에 달려 있습니다. (이론적으로 스택을 전혀 사용하지 않는 벙어리 컴파일러를 작성하고 모든 것을 동적으로 할당 할 수 있습니다.) – GManNickG

+0

@GManNickG 알다시피, 나는 완전히 그것을 놓쳤습니다! "스택 및 힙 개념 없음", 정말요? 또한 "동적으로"또는 "정적으로"할당되지 않았습니까? 당신 말이 맞을지도 모르지만, Std의 빠른 검색은 그것에 동의합니다. 동적 할당을 기술하는'new'와' '의 스펙이 정적 할당 스펙이 없다는 것을 특별히 생각한 것 같습니다. 당신의 벙어리 컴파일러를 감안할 때 스택에 모든 것을 할 수 있는지 궁금합니다. 아마 아니, 어떻게 내가'새'를지지 할 수 있을까? 그러나 그것은 다른 질문입니다. – towi

11

C++에는 스택 또는 힙 개념이 없습니다. 그것들은 구현 세부 사항이며, 전통적인 스택을 사용하지 않는 적어도 하나의 플랫폼이 있습니다 (대신 힙 할당 목록이 링크되어 있습니다).

자동 저장 장치 및 무료 저장 장치가 있습니다. new은 무료 저장소에 액세스하고 "스택에있는"변수는 자동 저장소에 저장됩니다.

실제로 무료 저장소에있는 항목을 할당하려면 메모리 부족 예외가 발생할 위험이 있습니다. 그래서 일반적인 규칙은 자동 저장을 사용해야한다는 것을 보장하는 것들입니다. array은이 보장을 보장합니다 (본질적으로 던질 수있는 것을 제외하고). 또한 일반 오래된 데이터의 집합체이며, 효과적으로처럼 보이도록 강제 : 실제 C++되지는 마법을 통해 컴파일러에 의해 구현 될 수있는 이론적으로

template<class T,std::size_t N> 
struct array { 
    T __no_fixed_name__[N]; 
    // non-constructor/destructor methods omitted as they are noise at this point 
}; 

,하지만 필요는 아무도 그래서이 없다 귀찮아.

TL : 예, 스택에 있습니다.

+1

흥미로운 스택없는 구현을 가르쳐 주시겠습니까? 재미있는 소리로 들립니다. (이러한 것들은 결코 TL이 아닙니다; DR ...) – towi

+0

@towi 미안하지만, 나는 그것을 알고 있습니다. – Yakk

+3

@ towi [IBM 메인 프레임, 분명히.] (http://stackoverflow.com/questions/10900885/are-there-stackless-or-heapless-implementation-of-c) Jerry Coffin의 답변에 대한 자세한 설명 그곳에. – hvd