Skip to content

✨ Best Practices

🔒 Const Correctness

// ✅ GOOD: Const everywhere possible
void processAudio(const float* input, float* output, size_t size) const;

// ✅ GOOD: Const member functions
size_t getBufferSize() const { return buffer_size_; }

🚀 Move Semantics

// ✅ GOOD: Move expensive objects
Buffer createBuffer(size_t size) {
    Buffer buffer(size);
    return buffer;  // RVO or move
}

auto buffer = createBuffer(1024);  // No copy

🎯 Prefer Algorithms

// ✅ GOOD: Use STL algorithms
std::transform(input.begin(), input.end(), output.begin(),
               [gain](float x) { return x * gain; });

// ❌ BAD: Manual loops
for (size_t i = 0; i < size; ++i) {
    output[i] = input[i] * gain;
}

🌍 Avoid Globals

// ❌ BAD: Global state
float g_sample_rate;

// ✅ GOOD: Pass as parameter or member
class Processor {
    float sample_rate_;
};

⚡ Cache-Friendly

// ✅ GOOD: Struct of Arrays
struct Voices {
    std::vector<float> frequencies;
    std::vector<float> amplitudes;
};

// ❌ BAD: Array of Structs (for hot loops)
struct Voice { float frequency, amplitude; };
std::vector<Voice> voices;