From 3b159edbe4e80a2bc19c4c2fcd42cb996b9fbfe0 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sat, 3 Dec 2016 17:53:19 +0200 Subject: [PATCH] Remove dynamic allocation from VertexFormat On 64-bit systems the pointer takes eight bytes, and a typical malloc implementation will have two pointers worth of overhead. Vertex formats hardly ever reach even eight components, so it's cheaper to just store a fixed-size array in the class itself. --- source/vertexformat.cpp | 59 +++++++---------------------------------- source/vertexformat.h | 14 +++++----- 2 files changed, 17 insertions(+), 56 deletions(-) diff --git a/source/vertexformat.cpp b/source/vertexformat.cpp index 8cc0cec9..037305f8 100644 --- a/source/vertexformat.cpp +++ b/source/vertexformat.cpp @@ -11,72 +11,33 @@ namespace Msp { namespace GL { VertexFormat::VertexFormat(): - data(0) + count(0) { } VertexFormat::VertexFormat(VertexComponent c): - data(new unsigned char[8]) + count(1) { - data[0] = 1; - data[1] = c; -} - -VertexFormat::VertexFormat(const VertexFormat &f): - data(0) -{ - *this = f; -} - -VertexFormat &VertexFormat::operator=(const VertexFormat &f) -{ - delete[] data; - if(f.data) - { - data = new unsigned char[(f.data[0]&~7)+8]; - copy(f.data, f.data+f.data[0]+1, data); - } - else - data = 0; - - return *this; -} - -VertexFormat::~VertexFormat() -{ - delete[] data; + components[0] = c; } VertexFormat VertexFormat::operator,(VertexComponent c) const { + if(count>=MAX_COMPONENTS) + throw invalid_operation("VertexFormat::operator,"); + VertexFormat r = *this; - if(r.data) - { - const unsigned char n = ++r.data[0]; - if((n&7)==0) - { - unsigned char *newdt = new unsigned char[n+8]; - copy(r.data, r.data+n, newdt); - delete r.data; - r.data = newdt; - } - r.data[n] = c; - } - else - { - r.data = new unsigned char[8]; - r.data[0] = 1; - r.data[1] = c; - } + r.components[r.count++] = c; return r; } VertexFormat VertexFormat::operator,(unsigned i) const { - if(!data) + if(!count) throw invalid_operation("VertexFormat::operator,"); + VertexFormat r = *this; - unsigned char *c = r.data+r.data[0]; + unsigned char *c = &r.components[r.count-1]; *c = make_indexed_component(static_cast(*c), i); return r; diff --git a/source/vertexformat.h b/source/vertexformat.h index 4c343c99..7edca1f3 100644 --- a/source/vertexformat.h +++ b/source/vertexformat.h @@ -33,21 +33,21 @@ enum VertexComponent class VertexFormat { private: - unsigned char *data; + enum { MAX_COMPONENTS = 15 }; + + unsigned char count; + unsigned char components[MAX_COMPONENTS]; public: VertexFormat(); VertexFormat(VertexComponent); - VertexFormat(const VertexFormat &); - VertexFormat &operator=(const VertexFormat &); - ~VertexFormat(); VertexFormat operator,(VertexComponent c) const; VertexFormat operator,(unsigned i) const; - bool empty() const { return !data || !data[0]; } - const unsigned char *begin() const { return data ? data+1 : 0; } - const unsigned char *end() const { return data ? data+1+data[0] : 0; } + bool empty() const { return !count; } + const unsigned char *begin() const { return components; } + const unsigned char *end() const { return components+count; } unsigned stride() const; int offset(VertexComponent) const; }; -- 2.43.0