배치 New 배치가 이식성을 보장할 수 있습니까?
placement new는 C에서 배열을 초기화하는 수단을 제공하지만 배열에 대한 사용은 잠재적인 가능성을 제공합니다. 이식성 문제. 특히 new[]에서 얻은 포인터가 제공된 주소에서 벗어날 수 있어 배열에 대한 버퍼 할당을 방해할 수 있습니다.
표준 5.3.4, 참고 12에서는 이러한 불일치를 인정하여 버퍼 할당을 어렵게 만듭니다. 배열에 적합한 크기. 다음 예에서는 문제를 강조합니다.
int main() { const int NUMELEMENTS = 20; char *pBuffer = new char[NUMELEMENTS * sizeof(A)]; A *pA = new(pBuffer) A[NUMELEMENTS]; // With Visual Studio, pA will be four bytes higher than pBuffer printf("Buffer address: %x, Array address: %x\n", pBuffer, pA); }
이 예에서 컴파일러는 버퍼의 처음 4바이트에 배열 요소 수를 저장하는 것으로 보입니다. 결과적으로 버퍼가 sizeof(A) * NUMELEMENTS바이트의 공간으로만 할당되기 때문에 메모리 손상이 발생합니다.
이식성 문제 방지:
이러한 이식성을 완화하려면 문제가 있는 경우 다음 접근 방식을 고려하십시오.
int main() { const int NUMELEMENTS = 20; char *pBuffer = new char[NUMELEMENTS * sizeof(A)]; A *pA = (A*)pBuffer; for (int i = 0; i < NUMELEMENTS; ++i) { pA[i] = new (pA + i) A(); } printf("Buffer address: %x, Array address: %x\n", pBuffer, pA); }
new[] 배치에 대한 추가 오버헤드는 구현 및 클래스 정의에 따라 달라질 수 있다는 점에 유의하는 것이 중요합니다. 그럼에도 불구하고 이 수동 접근 방식은 다양한 컴파일러 간의 이식성을 보장하고 오버헤드를 동적으로 확인할 필요가 없습니다.
위 내용은 배열에 새로 배치하면 C에서 이식성이 보장됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!