c++ - 스칼라`new T` vs 배열`new T[1]`



new-operator (2)

규칙은 간단합니다. delete[]new[] 와 일치해야하고 deletenew 와 일치해야합니다. 다른 조합 사용에 대한 동작은 정의되어 있지 않습니다.

컴파일러는 as-if 규칙 으로 인해 new T[1] 을 간단한 new T 로 변환 할 수 있습니다 (그리고 적절하게 delete[] 처리). 나는 이것을하는 컴파일러를 보지 못했다.

성능에 대한 예약이 있으면 프로파일 링하십시오.

우리는 최근에 일부 코드가 체계적으로 new T[1] 사용하고 있음을 발견했으며 ( delete[] 적절하게 일치 함), 이것이 무해하거나 생성 된 코드에 약간의 단점이 있는지 궁금합니다 (공간 또는 시간 / 성능). . 물론 이것은 함수와 매크로 레이어 뒤에 숨겨져 있지만 그 점이 아닙니다.

논리적으로, 둘 다 비슷하지만, 그것들입니까?

컴파일러는이 코드를 (변수가 아니라 리터럴 1을 사용하지만 함수 레이어를 통해 1 이 인수 변수로 바뀌기 때문에 new T[n] 사용하여 코드에 도달하기 전에 2를 3 회) 스칼라 new T 로 변환 할 수 있습니까? ?

이 둘의 차이점에 대해 알아야 할 다른 고려 사항이 있습니까?


아니요, 컴파일러는 new T[1]new T 로 바꿀 수 없습니다. operator newoperator new[] (및 해당 삭제)는 교체 가능합니다 ([basic.stc.dynamic] / 2). 사용자 정의 대체는 어떤 것이 호출되는지를 감지 할 수 있으므로 as-if 규칙은이 대체를 허용하지 않습니다.

참고 : 컴파일러에서 이러한 함수가 대체되지 않았다는 것을 감지하면 변경 될 수 있습니다. 그러나 소스 코드에는 컴파일러 제공 함수가 대체되고 있음을 나타내는 것이 없습니다. 대체는 일반적으로 대체 버전 (라이브러리 제공 버전을 숨기는)을 링크 하여 링크 타임에 수행됩니다. 컴파일러 가 알기에는 너무 늦습니다.





new-operator