]> git.tdb.fi Git - libs/gl.git/commitdiff
Remove dynamic allocation from VertexFormat
authorMikko Rasa <tdb@tdb.fi>
Sat, 3 Dec 2016 15:53:19 +0000 (17:53 +0200)
committerMikko Rasa <tdb@tdb.fi>
Sat, 3 Dec 2016 15:53:19 +0000 (17:53 +0200)
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
source/vertexformat.h

index 8cc0cec990157719b87ffe70e640b4c579829f77..037305f8d74251c9e6cd882540df733e292afc30 100644 (file)
@@ -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<VertexComponent>(*c), i);
 
        return r;
index 4c343c99e60f2def0d13571213d71da5ddef132b..7edca1f3dcf74782d8fd5a94c7bfb25cd079c72d 100644 (file)
@@ -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;
 };