summaryrefslogtreecommitdiff
path: root/md/notes
diff options
context:
space:
mode:
Diffstat (limited to 'md/notes')
-rw-r--r--md/notes/undefined_c/titles.md61
1 files changed, 61 insertions, 0 deletions
diff --git a/md/notes/undefined_c/titles.md b/md/notes/undefined_c/titles.md
index 2a47cc0..2c5bcd1 100644
--- a/md/notes/undefined_c/titles.md
+++ b/md/notes/undefined_c/titles.md
@@ -180,6 +180,67 @@ Yes there is possible to write as many expressions as needed.
### Structure
+
+Structure allows to combine types under one new type. Structure is convenient way how to combine set
+of types and reuse them as one.
+
+```c
+struct struct1 {
+ uint8_t a;
+ uint16_t b;
+ uint32_t c;
+ uint64_t d;
+};
+```
+
+Total intuitive size of structure would be
+```c
+int total_szie = sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint32_t) + sizeof(uint64_t);
+int real_size = sizeof(struct1);
+```
+
+Types are placed inside structure to make fast access to them. Some instructions of CPU may require
+to access aligned memory addresses to not have penalty on accessing types inside structure.
+
+To directly mess with alignment of types use attribute
+```c
+__attribute__ ((aligned (8)))
+```
+
+
+Use attributes to pack structure and be not architecture dependent.
+
+```c
+struct struct2 {
+ uint8_t a;
+ uint16_t b;
+ uint32_t c;
+ uint64_t d;
+} __attribute__((packed));
+```
+
+Now let check size of structure after it packed
+
+```c
+int new_size = sizeof(struct2);
+```
+
+Also there is possible to add aligmnet to each time in structure
+```c
+struct struct3 {
+ uint8_t a __attribute__((aligned (8)));
+ uint16_t b __attribute__((aligned (8)));
+ uint32_t c __attribute__((aligned (8)));
+ uint64_t d __attribute__((aligned (8)));
+} __attribute__((aligned (8)));
+```
+
+Now size of structure will be 32.
+
+All results on amd64, other arch may differ.
+
+
+
### Recursion
### Macro
### Signed/Unsigned