2014-12-18 2 views
5

최근에 녹을 많이 읽었지만 아직도 산화하기 시작했습니다. 내 두뇌는 C/C++ 반사 신경의 대부분을 유지하므로 녹이 어떻게 진행되는지에 대해이 질문이 관련이 없다면 나를 용서해주십시오.Rust와 함께 할당 된 힙 메모리를 분할하고 사용하는 방법은 무엇입니까?

일반적으로 힙에 임의 크기의 블록을 할당 한 다음 작은 크기의 메모리 덩어리에 대한 소유권을 갖는 바인딩을 사용하여 데이터 구조를 매핑 할 수 있습니까? C99를 사용

, 하나는이 쓸 수 있습니다 :

typedef unsigned char BYTE; 

typedef struct { 
    size_t size; 
    BYTE payload[]; 
} flex; 

// ... 

flex * flex_new(size_t _size) { 
    flex *f = malloc(sizeof(flex) + _size * sizeof(BYTE)); 
    f->size = _size; 
    return f; 
} 

유연한 길이 배열 유용한 예를 들어 증명할 수 있습니다 가변 크기의 청크가있는 메모리 풀을 구현할 때 또는 스레드 전용의 힙에 메모리를 할당 할 때. 런타임시에만 필요한 크기를 요구하는 데이터 구조는 '원자 적'방식으로 할당되고 멤버는 연속적으로 패킹됩니다.

필자는 유사한 녹 구현이 가능한지 (unsafe 구조가없는) 궁금하고 궁금하다. 어쩌면 컴파일러는 struct 정의에서 평생 지정자를 사용하여 일부 정보를 유추 할 수 있습니까? 의 측면에서

+2

아마 좋은 용도가있을 수 있지만 그렇다면 '안전하지 않은 것'을 사용하는 것 같습니다. 'Vec'은''(length, capacity, items) ''포인터가 아닌'(ptr, length, capacity)'트리플입니다. ,'Arena'는 절대로 크기가 조정되지 않는 Vec에 피기 백합니다. – delnan

+1

나는'Arena'에 대해 몰랐으며 한번에 살펴볼 것입니다. 감사합니다! 안전한 인터페이스가'std'에서 또는 그 인터페이스의 후보로 제공되는 한'안전하지 않은'것이 사용되는지는 신경 쓰지 말아야한다. – dummydev

+1

@delnan이 답변으로 추가해야하는 것처럼 들립니다.^_^ – Shepmaster

답변

2

'유연한 길이 배열,'당신이 즉시 필요 이상으로 할당 할 Vec::with_capacity를 사용할 수 있습니다

let mut vec: Vec<int> = Vec::with_capacity(10); 

// The vector contains no items, even though it has capacity for more 
assert_eq!(vec.len(), 0); 

// These are all done without reallocating... 
for i in range(0i, 10) { 
    vec.push(i); 
} 

// ...but this may make the vector reallocate 
vec.push(11); 

을 더 일반적인 경우를 들어, TypedArena는하지만, 사용하고자하는 것입니다 것입니다.

+0

아레나 링크가 손상된 것 같습니다. – tafia