Home > Back-end >  Statically allocate array with struct containing a string
Statically allocate array with struct containing a string

Time:10-22

I am writing a program that has an array which size I know, it is a fixed instruction set. Each entry in the array maps to an struct of the opcode and some metadata, such as the function that implements the opcode and its name, a String.

I need to allocate the array before I actually compute and fill the instruction set on each opcode.

Rust won't let me allocate such array statically, even if I know the size and when the initialized state does NOT require ANY pointers, as I would like all strings to be empty, which means no allocations and you could have a "zero value" of the string that is preferably fine to be copied.

Any suggestions? Is there anyway to do it? Seems Rust really likes to you use a Vec for everything? Even when static memory, which should be preferable on a non GC program language, would have been possible in many cases such as this? This is confusing.

CodePudding user response:

From the rust reference:

If the length operand has a value greater than 1 then this requires that the type of the repeat operand is Copy or that it must be a path to a constant item.

Therefore, to initialize an array using [VALUE; NUM] syntax, either the type implements the Copy trait or that VALUE is a const.

As pointed out by Chayim Friedman, you can use code like below:

const EMPTY: Instruction = Instruction { name: String::new() };
static ARRAY: [Instruction; 5] = [EMPTY; 5];

However, if you are working with a fixed set of data, it might be easier to just populate the list with predefined names, using &'static str.

If there is a need to create an array from a value that cannot be made to a constant and is not Copy, you can use std::array::from_fn like so:

let value = String::new();
let array: [_; 6] = std::array::from_fn(|_| value.clone());
  • Related