J'essayais de construire une implémentation naïve d'une structure String personnalisée avec une optimisation de petite chaîne. Maintenant que les unions sont autorisées dans Rust stable, j'ai trouvé le code suivant:

struct Large {
    capacity: usize,
    buffer: *mut u8,
}

struct Small([u8; 16]);

union Container {
    large: Large,
    small: Small,
}

struct MyString {
    len: usize,
    container: Container,
}

Je n'arrive pas à trouver un moyen d'allouer cela *mut u8. Est-il possible de le faire dans Rust stable? Il semble que l'utilisation de alloc::heap fonctionnerait, mais elle n'est disponible que la nuit.

1
Anna Jokela 25 juil. 2017 à 17:42

2 réponses

Qu'en est-il de Box::into_raw()?

struct TypeMatches(*mut u8);
TypeMatches(Box::into_raw(Box::new(0u8)));

Mais il est difficile de dire à partir de votre extrait de code si c'est ce dont vous avez vraiment besoin. Vous voulez probablement un vrai allocateur, et vous pouvez utiliser libc::malloc avec un cast as, comme dans cet exemple.

2
Florian Weimer 25 juil. 2017 à 15:01

Il existe une memalloc crate qui fournit une API d'allocation stable. Il est implémenté en allouant de la mémoire avec Vec::with_capacity, puis en extrayant le pointeur:

let vec = Vec::with_capacity(cap);
let ptr = buf.as_mut_ptr();
mem::forget(vec);

Pour libérer de la mémoire, utilisez Vec::from_raw_parts.

2
interjay 25 juil. 2017 à 15:05