@@ -1383,44 +1383,87 @@ a = Cat { name: "Spotty".to_string(), weight: 2.7 };
1383
1383
In this example, ` Cat ` is a _ struct-like enum variant_ ,
1384
1384
whereas ` Dog ` is simply called an enum variant.
1385
1385
1386
- ### Static items
1386
+ ### Constant items
1387
1387
1388
1388
``` {.ebnf .gram}
1389
- static_item : "static " ident ':' type '=' expr ';' ;
1389
+ const_item : "const " ident ':' type '=' expr ';' ;
1390
1390
```
1391
1391
1392
- A * static item* is a named _ constant value_ stored in the global data section
1393
- of a crate. Immutable static items are stored in the read-only data section.
1394
- The constant value bound to a static item is, like all constant values,
1395
- evaluated at compile time. Static items have the ` static ` lifetime, which
1396
- outlives all other lifetimes in a Rust program. Only values stored in the
1397
- global data section (such as string constants and static items) can have the
1398
- ` static ` lifetime; dynamically constructed values cannot safely be assigned the
1399
- ` static ` lifetime. Static items are declared with the ` static ` keyword. A
1400
- static item must have a _ constant expression_ giving its definition.
1392
+ A * constant item* is a named _ constant value_ which is not associated with a
1393
+ specific memory location in the program. Constants are essentially inlined
1394
+ wherever they are used, meaning that they are copied directly into the relevant
1395
+ context when used. References to the same constant are not necessarily
1396
+ guaranteed to refer to the same memory address.
1397
+
1398
+ Constant values must not have destructors, and otherwise permit most forms of
1399
+ data. Constants may refer to the address of other constants, in which case the
1400
+ address will have the ` static ` lifetime. The compiler is, however, still at
1401
+ liberty to translate the constant many times, so the address referred to may not
1402
+ be stable.
1401
1403
1402
- Static items must be explicitly typed. The type may be ` bool ` , ` char ` ,
1403
- a number, or a type derived from those primitive types. The derived types are
1404
- references with the ` static ` lifetime, fixed-size arrays, tuples, and structs.
1404
+ Constants must be explicitly typed. The type may be ` bool ` , ` char ` , a number, or
1405
+ a type derived from those primitive types. The derived types are references with
1406
+ the ` static ` lifetime, fixed-size arrays, tuples, enum variants , and structs.
1405
1407
1406
1408
```
1407
- static BIT1: uint = 1 << 0;
1408
- static BIT2: uint = 1 << 1;
1409
+ const BIT1: uint = 1 << 0;
1410
+ const BIT2: uint = 1 << 1;
1409
1411
1410
- static BITS: [uint, ..2] = [BIT1, BIT2];
1411
- static STRING: &'static str = "bitstring";
1412
+ const BITS: [uint, ..2] = [BIT1, BIT2];
1413
+ const STRING: &'static str = "bitstring";
1412
1414
1413
1415
struct BitsNStrings<'a> {
1414
1416
mybits: [uint, ..2],
1415
1417
mystring: &'a str
1416
1418
}
1417
1419
1418
- static BITS_N_STRINGS: BitsNStrings<'static> = BitsNStrings {
1420
+ const BITS_N_STRINGS: BitsNStrings<'static> = BitsNStrings {
1419
1421
mybits: BITS,
1420
1422
mystring: STRING
1421
1423
};
1422
1424
```
1423
1425
1426
+ ### Static items
1427
+
1428
+ ``` {.ebnf .gram}
1429
+ static_item : "static" ident ':' type '=' expr ';' ;
1430
+ ```
1431
+
1432
+ A * static item* is similar to a * constant* , except that it represents a precise
1433
+ memory location in the program. A static is never "inlined" at the usage site,
1434
+ and all references to it refer to the same memory location. Static items have
1435
+ the ` static ` lifetime, which outlives all other lifetimes in a Rust program.
1436
+ Static items may be placed in read-only memory if they do not contain any
1437
+ interior mutability.
1438
+
1439
+ Statics may contain interior mutability through the ` UnsafeCell ` language item.
1440
+ All access to a static is safe, but there are a number of restrictions on
1441
+ statics:
1442
+
1443
+ * Statics may not contain any destructors.
1444
+ * The types of static values must ascribe to ` Sync ` to allow threadsafe access.
1445
+ * Statics may not refer to other statics by value, only by reference.
1446
+ * Constants cannot refer to statics.
1447
+
1448
+ Constants should in general be preferred over statics, unless large amounts of
1449
+ data are being stored, or single-address and mutability properties are required.
1450
+
1451
+ ```
1452
+ use std::sync::atomic;
1453
+
1454
+ // Note that INIT_ATOMIC_UINT is a *const*, but it may be used to initialize a
1455
+ // static. This static can be modified, so it is not placed in read-only memory.
1456
+ static COUNTER: atomic::AtomicUint = atomic::INIT_ATOMIC_UINT;
1457
+
1458
+ // This table is a candidate to be placed in read-only memory.
1459
+ static TABLE: &'static [uint] = &[1, 2, 3, /* ... */];
1460
+
1461
+ for slot in TABLE.iter() {
1462
+ println!("{}", slot);
1463
+ }
1464
+ COUNTER.fetch_add(1, atomic::SeqCst);
1465
+ ```
1466
+
1424
1467
#### Mutable statics
1425
1468
1426
1469
If a static item is declared with the ` mut ` keyword, then it is allowed to
@@ -1455,6 +1498,9 @@ unsafe fn bump_levels_unsafe2() -> uint {
1455
1498
}
1456
1499
```
1457
1500
1501
+ Mutable statics have the same restrictions as normal statics, except that the
1502
+ type of the value is not required to ascribe to ` Sync ` .
1503
+
1458
1504
### Traits
1459
1505
1460
1506
A _ trait_ describes a set of method types.
0 commit comments