官术网_书友最值得收藏!

Heaps and stacks

As we discussed in Chapter 1, Hello Rust!, stack variables are preferred thanks to their low overhead and speed compared to heap-allocated data, which automatically introduces overhead thanks to the necessary heap pointer. For stack variables, Rust's types even allow for zero overhead structures, so no additional metadata is stored. The following snippet asserts that there are no additional bytes being used for arrays or user-defined types:

use std::mem;

struct MyStruct {
a: u8,
b: u8,
c: u8
}

fn main() {
assert_eq!(mem::size_of::<MyStruct>(), 3 * mem::size_of::<u8>());
assert_eq!(mem::size_of::<[MyStruct; 2]>(), 3 * mem::size_of::<u8>() * 2);
}

Consequently, the size of an instance of the MyStruct type is always going to be three bytes—perfectly suitable for placing it on the stack. Why is that good? In short, data locality. Instead of pointer dereferencing, the data is stored right at the point of execution, making it easy to cache and fast to access.

Types that don't have predictable sizes (such as String instances) require heap allocation, just like objects that are wrapped into Rc, Cell, RefCell, or Box instances. However, heap allocations and access come at a considerable cost, as minimizing those typically yields great performance improvements.

主站蜘蛛池模板: 连平县| 鄂托克旗| 雅江县| 山西省| 时尚| 德兴市| 阳高县| 凤庆县| 池州市| 墨竹工卡县| 剑阁县| 镇赉县| 乃东县| 辽宁省| 长兴县| 专栏| 麻城市| 赤水市| 阿尔山市| 即墨市| 武清区| 四平市| 满洲里市| 大庆市| 黄山市| 嘉兴市| 江阴市| 增城市| 新泰市| 淄博市| 卢湾区| 南宁市| 中山市| 宜昌市| 恩施市| 阳东县| 泗洪县| 将乐县| 满洲里市| 镇安县| 韶山市|