Pārlūkot izejas kodu

Small changes to save memory for small strings

mingodad 7 gadi atpakaļ
vecāks
revīzija
7071c39013
2 mainītis faili ar 10 papildinājumiem un 4 dzēšanām
  1. 5 3
      SquiLu/squirrel/sqstate.cpp
  2. 5 1
      SquiLu/squirrel/sqstring.h

+ 5 - 3
SquiLu/squirrel/sqstate.cpp

@@ -668,7 +668,7 @@ SQString *SQStringTable::Add(SQString *strBuf)
     SQString *t = Contains(strBuf->_val, strBuf->_len, newhash, h);
     SQString *t = Contains(strBuf->_val, strBuf->_len, newhash, h);
 #endif
 #endif
     if(t) {
     if(t) {
-        SQ_FREE(strBuf,sizeof(SQString) + rsl(strBuf->_len));
+        SQ_FREE(strBuf,SQSTRING_CALCULATED_SIZE(rsl(strBuf->_len)));
         return t;
         return t;
     }
     }
     return Add(strBuf, newhash, h);
     return Add(strBuf, newhash, h);
@@ -689,7 +689,8 @@ SQString *SQStringTable::Add(SQString *strBuf, SQHash newhash, SQHash h)
 
 
 SQString *SQStringTable::NewStrBuf(SQInteger len)
 SQString *SQStringTable::NewStrBuf(SQInteger len)
 {
 {
-    SQInteger calculated_size = rsl(len)+sizeof(SQString);
+	//Take in account padding
+	SQInteger calculated_size = SQSTRING_CALCULATED_SIZE(rsl(len));
 	SQString *t = (SQString *)SQ_MALLOC(calculated_size);
 	SQString *t = (SQString *)SQ_MALLOC(calculated_size);
 	memset(t, 0, calculated_size);
 	memset(t, 0, calculated_size);
 	new (t) SQString;
 	new (t) SQString;
@@ -730,7 +731,8 @@ void SQStringTable::Remove(SQString *bs)
 			_slotused--;
 			_slotused--;
 			SQInteger slen = s->_len;
 			SQInteger slen = s->_len;
 			s->~SQString();
 			s->~SQString();
-			SQ_FREE(s,sizeof(SQString) + rsl(slen));
+			//printf("Free str %p : %d : %.*s\n", s, (int)SQSTRING_CALCULATED_SIZE(rsl(slen))), (int)slen, s->_val);
+			SQ_FREE(s,SQSTRING_CALCULATED_SIZE(rsl(slen)));
 			return;
 			return;
 		}
 		}
 		prev = s;
 		prev = s;

+ 5 - 1
SquiLu/squirrel/sqstring.h

@@ -11,6 +11,10 @@ inline SQHash _hashstr (const SQChar *s, size_t l)
 		return h;
 		return h;
 }
 }
 
 
+#define SQSTRING_PAD_VAL (sizeof(void*))
+#define SQSTRING_CALCULATED_SIZE(sl) \
+    ((sl >= SQSTRING_PAD_VAL) ? (sizeof(SQString)+(sl-SQSTRING_PAD_VAL+1)) \
+     : (sizeof(SQString)))
 struct SQString : public SQRefCounted
 struct SQString : public SQRefCounted
 {
 {
 	SQString(){}
 	SQString(){}
@@ -23,7 +27,7 @@ public:
 	SQString *_next; //chain for the string table
 	SQString *_next; //chain for the string table
 	SQInteger _len;
 	SQInteger _len;
 	SQHash _hash;
 	SQHash _hash;
-	SQChar _val[1];
+	SQChar _val[SQSTRING_PAD_VAL];
 	//<FIXME> Padding not accounted
 	//<FIXME> Padding not accounted
 };
 };