Bootstrapping Classes

Dear Computer

Chapter 5: Objects

Bootstrapping Classes

Did you know that in the early days of C++, it was just a thin veneer over C? Classes were just syntactic sugar that were translated into C code. Suppose you had this Hero class:

C++
class Hero {
  public:
    Hero(char* name, int hit_points) {
      this->name = strdup(name);
      this->hit_points = hit_points;
    }

    void cure(int boost) {
      hit_points += boost;
    }

  private:
    char* name;
    int hit_points; 
}

Somehow this code had to get translated into C, where classes weren't a thing. But C does have structs, so Hero would get turned into one like this:

C
struct Hero {
  char* name;
  int hit_points;
}

What about the methods of Hero? They'd get turned into regular C functions:

C
void cure(struct Hero *hero, int boost) {
  hero->hit_points += boost;
}

Notice how the receiver becomes the first formal parameter. But it wasn't called hero. It was called this:

C
void cure(struct Hero *this, int boost) {
  this->hit_points += boost;
}

What happened when we instantiated an object, like this?

C++
int main() {
  Hero *frank = new Hero("Frank", 260);
  // ...
}

It turned into code like this:

C
void initialize_hero(struct Hero *this, char *name, int hit_points) {
  this->name = strdup(name); 
  this->hit_points = hit_points;
}

int main() {
  struct Hero *frank = (struct Hero *) malloc(sizeof(struct Hero));
  initialize_hero(frank, "Frank", 260);
  // ...
}

As C++ grew and got its own compiler, it stopped translating classes into C and went directly into machine code. Yet this translation to C still hints at how objects are treated internally.

← Reuse Without InheritanceMultiple Inheritance →