Aritmética em constantes de compilação é avaliada em tempo de compilação:
const X = 10 + 20 // dobrado para const X = 30
int y = 5 * 7 // gera: int32_t y = 35
Toda fn (exceto export fn e extern fn) é gerada como:
__attribute__((always_inline)) static inline tipo_retorno nome_func(params);
struct Particles {
float positions[4] __attribute__((aligned(16))); // SSE
double velocities[2] __attribute__((aligned(32))); // AVX
};
static inline void* block_alloc(BlockCtx* ctx, int64_t size) {
void* ptr = ctx->ptr;
ctx->ptr += size;
if (ctx->ptr > ctx->end) error("block overflow");
return ptr;
}
Para tipos ≤ 64 bytes, o pool allocator fornece alocação e liberação O(1).
| Alocador | Alocação | Free | Reset | Fragmentação |
|---|---|---|---|---|
| Block (bump) | ~3 ciclos | N/A | ~5 ns | Nenhuma |
| Pool | O(1) | O(1) | O(1) | Interna apenas |
| malloc | ~100 ciclos | ~50 ciclos | N/A | Sim |
__thread BlockCtx* block_tls;
block_set_tls(ctx);
block_enable_double_buffer(ctx);
block_swap_buffers(ctx); // swap atômico (~1 ciclo)
| Operação | Brick | C Puro | Razão |
|---|---|---|---|
| Soma int | 1 ciclo | 1 ciclo | 1.0× |
| Chamada função (inline) | 0 ciclos | 0 ciclos | 1.0× |
| Acesso campo struct | 1 ciclo | 1 ciclo | 1.0× |
| Block alloc | 3 ciclos | n/a | — |
| Dispatch vtbl | 2-3 ciclos | igual | 1.0× |