나는 그것이 오래된 질문이라는 것을 알고 있지만 모든 사람들이 놓친 것 같은 몇 가지가 있습니다.
사이즈 << 1 이것에 의해 승산된다 : 첫째,이 (2)에 의한 승산은 아무것도 1과 2 사이 : INT (플로트 (크기) * X), * 표시는 숫자 부동이다 X 소수점 연산하고, 상기 프로세서는 보유 float와 int 간의 캐스팅에 대한 추가 지침을 실행합니다. 즉, 기계 수준에서 두 배는 새로운 크기를 찾기 위해 매우 빠른 단일 명령을 필요로합니다. 1과 2 사이의 값을 곱하려면 최소한크기를 float로 캐스팅하는 명령어 하나, 곱할 명령어 하나 (float 곱셈이므로 4 배 또는 8 배가 아니더라도 적어도 두 배 더 많은 사이클이 필요함), int로 다시 캐스팅하는 명령어 하나, 플랫폼이 특수 레지스터를 사용하는 대신 범용 레지스터에서 부동 연산을 수행 할 수 있다고 가정합니다. 간단히 말해, 각 할당에 대한 수학은 간단한 왼쪽 이동보다 10 배 이상 오래 걸릴 것으로 예상해야합니다. 하지만 재 할당하는 동안 많은 데이터를 복사하는 경우 큰 차이가 없을 수 있습니다.
둘째, 그리고 아마도 큰 키커 일 것입니다. 모든 사람은 해제되는 메모리가 새로 할당 된 메모리와 인접 할뿐만 아니라 자체적으로도 연속적이라고 가정하는 것 같습니다. 모든 메모리를 미리 할당 한 다음 풀로 사용하지 않는 한 이것은 거의 확실하지 않습니다. OS 는 때때로하지만 대부분의 경우 충분한 여유 공간 조각화가 발생하여 적절한 메모리 관리 시스템이 메모리에 딱 맞는 작은 구멍을 찾을 수 있습니다. 일단 정말 비트 청크에 도달하면 연속적인 조각으로 끝날 가능성이 더 높지만 그때까지는 할당량이 충분히 커져 더 이상 중요하지 않을만큼 자주 수행하지 않습니다. 요컨대, 이상적인 숫자를 사용하면 여유 메모리 공간을 가장 효율적으로 사용할 수 있다고 상상하는 것은 재미 있지만 실제로는 프로그램이 베어 메탈에서 실행되지 않는 한 발생하지 않을 것입니다 (OS가없는 것처럼 그 아래에서 모든 결정을 내립니다).
질문에 대한 내 대답은? 아니요, 이상적인 숫자는 없습니다. 아무도 실제로 시도하지 않을 정도로 응용 프로그램에 따라 다릅니다. 당신의 목표가 이상적인 메모리 사용이라면, 당신은 거의 운이 없습니다. 성능을 위해 덜 빈번한 할당이 더 좋지만, 그렇게한다면 4 또는 8을 곱할 수 있습니다! 물론 파이어 폭스가 한 번에 1GB에서 8GB로 점프하면 사람들이 불평 할 것이므로 말도 안됩니다. 그래도 다음과 같은 몇 가지 경험 규칙이 있습니다.
메모리 사용을 최적화 할 수 없다면 최소한 프로세서주기를 낭비하지 마십시오. 2를 곱하는 것은 부동 소수점 수학을 수행하는 것보다 적어도 한 배 더 빠릅니다. 그것은 큰 차이를 만들지 않을 수도 있지만 적어도 약간의 차이를 만들 것입니다 (특히 더 빈번하고 작은 할당 동안).
그것을 지나치게 생각하지 마십시오. 이미 완료된 작업을 수행하는 방법을 알아 내기 위해 4 시간을 소비했다면 시간을 낭비한 것입니다. 솔직히 * 2보다 더 나은 옵션이 있다면 수십 년 전에 C ++ 벡터 클래스 (및 기타 여러 곳)에서 수행되었을 것입니다.
마지막으로, 정말로 최적화하고 싶다면 작은 일에 땀을 흘리지 마십시오. 이제는 임베디드 시스템에서 작업하지 않는 한 아무도 4KB의 메모리 낭비에 대해 신경 쓰지 않습니다. 각각 1MB에서 10MB 사이의 1GB 개체에 도달하면 두 배로 늘릴 수 있습니다 (즉, 100 개에서 1,000 개 사이의 개체). 예상 확장 률을 추정 할 수 있으면 특정 지점에서 선형 성장률로 평준화 할 수 있습니다. 분당 약 10 개의 개체를 예상한다면 단계 당 5 ~ 10 개의 개체 크기 (30 초에서 1 분에 한 번)로 성장하는 것이 좋습니다.
결론은 과도하게 생각하지 말고 가능한 것을 최적화하고 필요한 경우 애플리케이션 (및 플랫폼)에 맞게 사용자 정의하는 것입니다.