memory and pointers

Memory

Int Main()

what is memory?

int main()
{
  int x = 3;
  int y = 2;
  int z = 5;
}
int x
int z
int y
3
2
5
???
???
???

memory

Memory

Int Main()

what is memory?

int main()
{
  int x = 3;
  int y = 2;
  int z = 5;
}
int x
int z
int y
3
2
5
???
???
???

memory

Memory

Int Main()

what is memory?

int foo()
{
  int n = 3;
}

int main()
{
  int x = 3;
  int y = 2;
  foo();
  int z = 5;
}
int x
int y
3
2
???
???

Int FOO()

int n
3
???

memory

Memory

Int Main()

what is memory?

int foo()
{
  int n = 3;
}

int main()
{
  int x = 3;
  int y = 2;
  foo();
  int z = 5;
}
int x
int y
3
2
???
???

Int FOO()

int n
3
???
int z
5
???

memory

Memory

Int Main()

what is memory?

int foo()
{
  int n = 3;
}

int main()
{
  int x = 3;
  int y = 2;
  foo();
  int z = 5;
}
int x
int z
int y
3
2
5
???
???
???

memory

the stack

what is memory?

ebp + 0x00
ebp + 0x01
ebp + 0x02
ebp + 0x03
ebp + 0x04
ebp + 0x05
ebp + 0x06
ebp + 0x07
ebp + 0x08
ebp + 0x09
ebp + 0x0a
ebp + 0x0b
ebp + 0x0c
ebp + 0x0d
ebp + 0x0e
ebp + 0x0f
ebp + 0x10
ebp + 0x11
ebp + 0x12
ebp + 0x13
ebp + 0x14
int main()
{
  int x = 3;
  int y = 2;
  int z = 5;
}
???
???
???
???
???
???
???
???
???
???
???
???
???
???
???
???
???
???
???
???
???

*Assuming big-endian

*x86 register names

esp

memory

what is memory?

ebp + 0x00
ebp + 0x01
ebp + 0x02
ebp + 0x03
ebp + 0x04
ebp + 0x05
ebp + 0x06
ebp + 0x07
ebp + 0x08
ebp + 0x09
ebp + 0x0a
ebp + 0x0b
ebp + 0x0c
ebp + 0x0d
ebp + 0x0e
ebp + 0x0f
ebp + 0x10
ebp + 0x11
ebp + 0x12
ebp + 0x13
ebp + 0x14
int main()
{
  int x = 3;
  int y = 2;
  int z = 5;
}
0
0
0
3
???
???
???
???
???
???
???
???
???
???
???
???
???
???
???
???
???

*Assuming big-endian

*x86 register names

esp

the stack

memory

what is memory?

ebp + 0x00
ebp + 0x01
ebp + 0x02
ebp + 0x03
ebp + 0x04
ebp + 0x05
ebp + 0x06
ebp + 0x07
ebp + 0x08
ebp + 0x09
ebp + 0x0a
ebp + 0x0b
ebp + 0x0c
ebp + 0x0d
ebp + 0x0e
ebp + 0x0f
ebp + 0x10
ebp + 0x11
ebp + 0x12
ebp + 0x13
ebp + 0x14
int main()
{
  int x = 3;
  int y = 2;
  int z = 5;
}
0
0
0
3
0
0
0
2
???
???
???
???
???
???
???
???
???
???
???
???
???

*Assuming big-endian

*x86 register names

esp

the stack

memory

what is memory?

ebp + 0x00
ebp + 0x01
ebp + 0x02
ebp + 0x03
ebp + 0x04
ebp + 0x05
ebp + 0x06
ebp + 0x07
ebp + 0x08
ebp + 0x09
ebp + 0x0a
ebp + 0x0b
ebp + 0x0c
ebp + 0x0d
ebp + 0x0e
ebp + 0x0f
ebp + 0x10
ebp + 0x11
ebp + 0x12
ebp + 0x13
ebp + 0x14
int main()
{
  int x = 3;
  int y = 2;
  int z = 5;
}
0
0
0
3
0
0
0
2
0
0
0
5
???
???
???
???
???
???
???
???
???

*Assuming big-endian

*x86 register names

esp

the stack

memory

memory

what is memory?

ebp + 0x00
ebp + 0x01
ebp + 0x02
ebp + 0x03
ebp + 0x04
ebp + 0x05
ebp + 0x06
ebp + 0x07
ebp + 0x08
ebp + 0x09
ebp + 0x0a
ebp + 0x0b
ebp + 0x0c
ebp + 0x0d
ebp + 0x0e
ebp + 0x0f
ebp + 0x10
ebp + 0x11
ebp + 0x12
ebp + 0x13
ebp + 0x14
int main()
{
  int x = 3;
  int y = 2;
  int z = 5;
}
0
0
0
3
0
0
0
2
0
0
0
5
???
???
???
???
???
???
???
???
???

*Assuming big-endian

*x86 register names

esp

the stack

endianness

what is endianness?

ebp + 0x00
ebp + 0x01
ebp + 0x02
ebp + 0x03
ebp + 0x04
ebp + 0x05
ebp + 0x06
ebp + 0x07
ebp + 0x08
ebp + 0x09
ebp + 0x0a
ebp + 0x0b
ebp + 0x0c
ebp + 0x0d
ebp + 0x0e
ebp + 0x0f
ebp + 0x10
ebp + 0x11
ebp + 0x12
ebp + 0x13
ebp + 0x14
3
0
0
0
2
0
0
0
5
0
0
0
???
???
???
???
???
???
???
???
???

little endian

memory

ebp + 0x00
ebp + 0x01
ebp + 0x02
ebp + 0x03
ebp + 0x04
ebp + 0x05
ebp + 0x06
ebp + 0x07
ebp + 0x08
ebp + 0x09
ebp + 0x0a
ebp + 0x0b
ebp + 0x0c
ebp + 0x0d
ebp + 0x0e
ebp + 0x0f
ebp + 0x10
ebp + 0x11
ebp + 0x12
ebp + 0x13
ebp + 0x14
0
0
0
3
0
0
0
2
0
0
0
5
???
???
???
???
???
???
???
???
???

big endian

memory

Size and Alignment

alignment

size

char
short
int
long long

memory

Size and Alignment

alignment

size

char
short
int
long long

memory

sizeof(char) == 1
alignof(char) == 1

Size and Alignment

alignment

size

char
short
int
long long

memory

sizeof(short) == 2
alignof(short) == 2

Size and Alignment

alignment

size

char
short
int
long long

memory

sizeof(int) == 4
alignof(int) == 4

Size and Alignment

alignment

size

char
short
int
long long

memory

sizeof(long long) == 8
alignof(long long) == 8

Size and Alignment

alignment

size

memory

struct my_data
{
  short s1;
  short s2;
  int x;
} my_object;
sizeof(my_data) == ...
alignof(my_data) == ...

Size and Alignment

alignment

size

memory

struct my_data
{
  short s1;
  short s2;
  int x;
} my_object;
sizeof(my_data) == 8
alignof(my_data) == ...
my_object.s1
my_object.s2
my_object.x

Size and Alignment

alignment

size

memory

struct my_data
{
  short s1;
  short s2;
  int x;
} my_array[2];
sizeof(my_data) == 8
alignof(my_data) == 8
my_array[0].s1
my_array[0].s2
my_array[0].x
my_array[1].s1
my_array[1].s2
my_array[1].x

Size and Alignment

alignment

size

memory

struct my_data
{
  short s1;
  int x;
  short s2;
} my_object;
sizeof(my_data) == ...
alignof(my_data) == ...

Size and Alignment

alignment

size

memory

struct my_data
{
  short s1;
  int x;
  short s2;
} my_object;
sizeof(my_data) == ...
alignof(my_data) == ...
my_object.s1
my_object.s2
my_object.x

Size and Alignment

alignment

size

memory

struct my_data
{
  short s1;
  int x;
  short s2;
} my_object;
sizeof(my_data) == 10???
alignof(my_data) == ...
padding
my_object.s1
my_object.s2
my_object.x

memory

struct my_data
{
  short s1;
  int x;
  short s2;
} my_array[2];

Size and Alignment

alignment

size

padding
sizeof(my_data) == 10???
alignof(my_data) == ...
my_array[0].s1
my_array[0].s2
my_array[0].x

memory

Size and Alignment

alignment

size

struct my_data
{
  short s1;
  int x;
  short s2;
} my_array[2];
sizeof(my_data) == 10???
alignof(my_data) == ...
my_array[0].s1
my_array[0].s2
my_array[0].x
my_array[1].s1
my_array[1].s2
my_array[1].x

memory

Size and Alignment

alignment

size

struct my_data
{
  short s1;
  int x;
  short s2;
} my_array[2];
sizeof(my_data) == 12
alignof(my_data) == 4
my_array[1].s1
my_array[1].s2
my_array[1].x
my_array[0].s1
my_array[0].s2
my_array[0].x

memory

Size and Alignment

alignment

size

struct my_data
{
  short s1;
  int x;
  short s2;
} my_object;
sizeof(my_data) == 12
alignof(my_data) == 4
my_object.s1
my_object.s2
my_object.x

Size and Alignment

alignment

size

sizeof(type)

sizeof(expression)

//sizeof(int) == 4

short s;
//sizeof(s) == 2

//sizeof('a') == 1
//alignof(int) == 4

short s;
//alignof(s) == 2

//alignof('a') == 1

alignof(type)

alignof(expression)

alignas(type)

alignof(aligment)

alignas (int) short x;
// alignof(x) == 4
// alignof(decltype(x)) == 2

alignas (128) int n;
// alignof(n) == 128
// alignof(decltype(n)) == 4

bitfields

what are bitfields?

#include <cstdint>

struct ipv4_header
{
  unsigned version : 4;
  unsigned ihl : 4;
  unsigned dscp : 6;
  unsigned ecn : 2;
  uint16_t total_length;
  uint16_t identification;
  unsigned flags : 3;
  unsigned fragment_offset : 13;
  uint8_t time_to_live;
  uint8_t protocol;
  uint16_t header_checksum;
  uint32_t source_ip_address;
  uint32_t destination_ip_address;
  uint64_t options_upper;
  uint64_t options_lower;
}
int8_t x1; // 8 bits
int16_t x2; // 16 bits
int32_t x3; // 32 bits
int64_t x4; // 64 bits

int b1 : 9; // 9 bits
int b2 : 13; // 13 bits;
int b3 : 120; // error: 120 bits > #int_bits

bitfields

what are bitfields?

#include <cstdint>

struct ipv4_header
{
  unsigned version : 4;
  unsigned ihl : 4;
  unsigned dscp : 6;
  unsigned ecn : 2;
  uint16_t total_length;
  uint16_t identification;
  unsigned flags : 3;
  unsigned fragment_offset : 13;
  uint8_t time_to_live;
  uint8_t protocol;
  uint16_t header_checksum;
  uint32_t source_ip_address;
  uint32_t destination_ip_address;
  uint64_t options_upper;
  uint64_t options_lower;
}

object

=
Data

object

sizeof(name)
alignof(name)
.................
decltype(name)
name
#name
.................
size
aligment
storage class
type
value
name
lifetime
(different than typeid(name))
(optional)
(may be undefined)
sizeof(name)
alignof(name)
.................
decltype(name)
name
#name
.................
size
aligment
storage class
type
value
name
lifetime
(different than typeid(name))
(optional)
(may be undefined)

object

object

object

"          " : {
  "memory_locations" : [
    "location_1" : {
      "subobject" : { ... } or "bitfields" : [...]
    },
    "location_2" : {
      "subobject" : { ... } or "bitfields" : [...]
    },
    "location_3" : {
      "subobject" : { ... } or "bitfields" : [...]
    },
    ...,
    "location_N" : {
      "subobject" : { ... } or "bitfields" : [...]
    },
  ]
}

object

struct my_type {
  int x;
  char b;
  int f0 : 3;
  int f1 : 2;
  int f2 : 7;
  int : 0;
  int f3 : 27;
  std::string s;
} data;

object

object

data

has

data

Is

   sizeof(data) ==
&& alignof(data) ==
&& std::is_same_v<decltype(data), my_data>()

data

x
b
f0
f1
f2
s
f3

memory location

object

data

x
b
f0
f1
f2
s
f3

memory location

address

object

address

object

pointers

(addresses)

Prototype

Address operator

Dereference operator

Member access operator

Type*
&object
*pointer
pointer->member
struct type
{
  int member1;
  bool member2;
}

type object = {1, true};

type* obj_ptr = &object;
(*obj_ptr) = {0, false};
obj_ptr->member12 = true;

pointers

(addresses)

Prototype

Address operator

Dereference operator

Member access operator

Type*
&object
*pointer
pointer->member
int arr[3] = {1, 2, 3};

int* arr_ptr = arr;
arr_ptr + 2 == &arr[2];
*(&arr[10] - 9) == 2;

Arrays as

Array

arr[0]
arr[1]
arr[2]

pointers

(addresses)

Prototype

Address operator

Dereference operator

Member access operator

Type*
&object
*pointer
pointer->member
const char* greeting = "Hi!";

greeting[0] == 'H';
greeting[3] == '\0';
*(greeting + 2) == '!';
*(&greeting[1]) == *(greeting + 1);

STRings as

"Hi!"
char[4]{'H', 'i', '!', '\0'}
=

pointers

(addresses)

Prototype

Address operator

Dereference operator

Member access operator

Type*
&object
*pointer
pointer->member
int arr[5] = {1, 2, 3, 4, 5};
int* ptr_to_array = arr;
int** ptr_to_ptr_to_array = &ptr_to_array;
int*** ptr_to_ptr_to_ptr_to_array = &ptr_to_array;
int**** ptr_to_ptr_to_ptr_to_ptr_to_array = &ptr_to_array;
...

pointers to

pointers

(addresses)
#include <iostream>

int* find_number_in_array(int* arr, int size, int number)
{
  for (int i = 0; i < size; ++i)
  {
    if (arr[i] == number)
    {
      return arr + i;
    }
  }
  return nullptr;
}

int main()
{
  int arr[5] = {1, 2, 3, 4, 5};
  
  int desired;
  std::cin >> desired;
  
  int* found = find_number_in_array(arr, 5, desired);
  if (found) // found != nullptr
  {
    std::cout << "Found number at position " << found - arr;
  }
  else
  {
    std::cout << "Number not found";
  }
}

null

memory and pointers

Memory and Pointers

By Jan Bielak

Memory and Pointers

A presentation about the memory and pointers in C++. It is presented here: https://www.youtube.com/watch?v=CSKsKfSJq6w .

  • 247