대부분의 숙련 된 프로그래머는 데이터 정렬이 프로그램의 성능에 중요하다는 것을 알고 있습니다. 필자는 프로그래머가 필요한 것보다 더 큰 버퍼 크기를 할당하는 프로그램을 작성하고 정렬 된 포인터를 시작으로 사용하는 것을 보았습니다. 나는 내 프로그램에서 그렇게해야하는지 궁금하다. C++의 새로운 연산에 의해 반환 된 주소의 정렬을 보장하지 못한다. 그래서 테스트 할 수있는 작은 프로그램을 작성C++의 새 연산에 의한 주소 반환 정렬을 보증합니까?
for(size_t i = 0; i < 100; ++i) {
char *p = new char[123];
if(reinterpret_cast<size_t>(p) % 4) {
cout << "*";
system("pause");
}
cout << reinterpret_cast<void *>(p) << endl;
}
for(size_t i = 0; i < 100; ++i) {
short *p = new short[123];
if(reinterpret_cast<size_t>(p) % 4) {
cout << "*";
system("pause");
}
cout << reinterpret_cast<void *>(p) << endl;
}
for(size_t i = 0; i < 100; ++i) {
float *p = new float[123];
if(reinterpret_cast<size_t>(p) % 4) {
cout << "*";
system("pause");
}
cout << reinterpret_cast<void *>(p) << endl;
}
system("pause");
내가 사용하고 컴파일러 모든 주소가 반환 된 새로운 작업이 정렬 된 것으로 보인다 비주얼 C++ 익스프레스 2008 년이다. 그러나 나는 확실하지 않다. 그래서 내 질문은 : 어떤 보증이 있습니까? 그들이 보증을한다면, 나는 자신을 조정할 필요가 없다. 그렇지 않다면,해야만한다.
이론적으로. 실제로 32 비트 시스템에서 gcc + glibc 및 SSE 유형을 사용하는 경우 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15795에 유의하십시오. – timday
@timday : 최근 버전의 MSVC++ (예 : .NET 2003)에서도 SSE 유형의이 문제가 발생했습니다. 최신 버전으로 테스트하지 않았지만 여전히 그렇다고 생각됩니다. –
'new []()'도우미 할당 함수에서 반환 된 값은'new [] '연산자에서 얻은 포인터와 같지 않습니다. 이 대답은 잘못되었습니다. –