Run Code
|
API
|
Code Wall
|
Users
|
Misc
|
Feedback
|
Login
|
Theme
|
Privacy
|
Patreon
Virtual table sketch
Language:
Ada
Assembly
Bash
C#
C++ (gcc)
C++ (clang)
C++ (vc++)
C (gcc)
C (clang)
C (vc)
Client Side
Clojure
Common Lisp
D
Elixir
Erlang
F#
Fortran
Go
Haskell
Java
Javascript
Kotlin
Lua
MySql
Node.js
Ocaml
Octave
Objective-C
Oracle
Pascal
Perl
Php
PostgreSQL
Prolog
Python
Python 3
R
Rust
Ruby
Scala
Scheme
Sql Server
Swift
Tcl
Visual Basic
Layout:
Vertical
Horizontal
//gcc 5.4.0 #include <stdio.h> #include <stdlib.h> #define DEBUG(...) printf(__VA_ARGS__); #define alloc_stack(class) ((struct class *)((char[sizeof(struct class) + sizeof(struct vtable)]){0})) #define alloc_heap(class) ((struct class *)malloc(sizeof(struct class) + sizeof(struct vtable))) #define access_vtable(class, instance) ((struct vtable *)(instance + sizeof(struct class))) struct accumulator { int a; int b; }; struct vtable { void (*set_a)(struct accumulator *instance, int a); int (*get_a)(struct accumulator *instance); void (*set_b)(struct accumulator *instance, int b); int (*get_b)(struct accumulator *instance); int (*sum)(struct accumulator *instance); }; void set_a(struct accumulator *instance, int a) { instance->a = a; } int get_a(struct accumulator *instance) { return instance->a; } void set_b(struct accumulator *instance, int b) { instance->b = b; } int get_b(struct accumulator *instance) { return instance->b; } int sum(struct accumulator *instance) { return instance->a + instance->b; } void accumulator_constructor(struct accumulator *instance) { instance->a = 0; instance->b = 0; struct vtable *methods = (struct vtable *)(instance + sizeof(struct accumulator)); methods->set_a = set_a; methods->get_a = get_a; methods->set_b = set_b; methods->get_b = get_b; methods->sum = sum; } int main(void) { printf("Memmory allocation... "); struct accumulator *instance = alloc_heap(accumulator); printf("instance at %p\r\n", instance); printf("Constructor\r\n"); accumulator_constructor(instance); printf("Setters\r\n"); struct vtable *methods = access_vtable(accumulator, instance); access_vtable(accumulator, instance)->set_a(instance, 1); access_vtable(accumulator, instance)->set_b(instance, 5); printf("Getters\r\n"); printf("a = %d\r\n", access_vtable(accumulator, instance)->get_a(instance)); printf("b = %d\r\n", access_vtable(accumulator, instance)->get_b(instance)); printf("a + b = %d\r\n", access_vtable(accumulator, instance)->sum(instance)); return 0; }
gcc
Show compiler warnings
[
+
] Compiler args
[
+
]
Show input
Compilation time: 0.12 sec, absolute running time: 0.07 sec, cpu time: 0.01 sec, memory peak: 3 Mb, absolute service time: 0,28 sec
edit mode
|
history
|
discussion
Memmory allocation... instance at 0x1885020 Constructor Setters Getters a = 1 b = 5 a + b = 6