✨ 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;