2014-04-11 5 views
2

나는 다음과 같은 코드가 있습니다D에서 구조체의 동적 배열을 만드는 방법?

struct MyStruct { 
    immutable int id; 
    immutable int value; 

    this() @disable; 

    this(immutable int pId) { 
     id = pId; 
     value = getValueById(id); 
    } 
} 

void main() { 
    MyStruct structs = new MyStruct[](256); // No default initializer 
    foreach(ulong id, MyStruct struct_; structs) { 
     structs[id] = MyStruct(id); // Cannot edit immutable members 
    } 
} 

난 그냥 동적 배열을 초기화하고 여기에 추가 할 수 있습니다 알고 있지만, 나는이 일을보다 효율적인 방법이 있는지 관심이 있어요. 나는 대부분의 메모리를 미리 알고있는 동안 매번 어떻게 재 할당해야하는지에 대해 주로 우려하고 있습니다.

답변

3

가장 간단한 솔루션은 동적 배열을 사용하고 추가하기 전에 .reserve 메서드를 호출하는 것입니다. 그러면 공간을 미리 할당 할 것이고 미래의 추가는 싸게 될 것입니다.

void main() { 
    MyStruct[] structs; 
    structs.reserve(256); // prealloc memory 
    foreach(id; 0 .. 256) 
     structs ~= MyStruct(id); // won't reallocate 
} 

이렇게 동적 인 배열을 사용하는 방법은 개별 구성원에게 쓰기 때문에 이와 같은 불변성으로 작업하지 않을 것이라고 생각합니다.

정적 배열을 원한다면 예약 보류가 작동하지 않지만 명시 적으로 ...를 void으로 초기화 할 수 있습니다. 그것은 메모리를 완전히 무작위로 남겨 두지 만 명시 적으로 요청했기 때문에 비활성화 된 기본 생성자가 멈추지 않습니다. (BTW는 @safe 함수에서 금지되어 있습니다.)하지만이 경우 불변의 멤버는 불변성을 버려서 soo를 준비하지 않으면 영원히 쓰레기를 남겨 둘 것입니다. 실용적이지는 않습니다. 미래.