更新
檢查羅伯特騎士的回答!使用C++ 11,但比這更乾淨...
原來的答案
怎麼樣這個討厭的黑客:
namespace priv {
#define PRIVATE_STATICMEM(_A_) \
template <size_t size> \
struct StaticMem<size,_A_> { \
__declspec(align(_A_)) char data[size]; \
void *operator new(size_t parSize) { \
return _aligned_malloc(parSize,_A_); \
} \
void operator delete(void *ptr) { \
return _aligned_free(ptr); \
} \
};
template <size_t size, size_t align> struct StaticMem {};
template <size_t size> struct StaticMem<size,1> {char data[size];};
PRIVATE_STATICMEM(2)
PRIVATE_STATICMEM(4)
PRIVATE_STATICMEM(8)
PRIVATE_STATICMEM(16)
PRIVATE_STATICMEM(32)
PRIVATE_STATICMEM(64)
PRIVATE_STATICMEM(128)
PRIVATE_STATICMEM(256)
PRIVATE_STATICMEM(512)
PRIVATE_STATICMEM(1024)
PRIVATE_STATICMEM(2048)
PRIVATE_STATICMEM(4096)
PRIVATE_STATICMEM(8192)
}
template <typename T, size_t size> struct StaticMem : public priv::StaticMem<sizeof(T)*size,__alignof(T)> {
T *unhack() {return (T*)this;}
T &unhack(size_t idx) {return *(T*)(data+idx*sizeof(T));}
const T &unhack() const {return *(const T*)this;}
const T &unhack(size_t idx) const {return *(const T*)(data+idx*sizeof(T));}
StaticMem() {}
StaticMem(const T &init) {unhack()=init;}
};
看起來嚇人,但你需要的一切,只有一次(在一些隱藏的很好的頭文件:)最好)。然後,您可以通過以下方式使用它:
StaticMem<T,N> array; //allocate an uninitialized array of size N for type T
array.data //this is a raw char array
array.unhack() //this is a reference to first T object in the array
array.unhack(5) //reference to 5th T object in the array
StaticMem<T,N> array;
可以出現在代碼中,還可以作爲一些較大的類的成員(這是我如何使用這個技巧),並當上了分配也應該表現正常堆。
錯誤修復:
的例子的第6行:char data[_A_]
校正成char data[size]
'... __alignof [結構]是結構中最大元素的對齊要求。「(http://msdn.microsoft.com/en-us/library/45t0s5f4(v=vs.71) .aspx) – 2011-02-27 16:35:19
如果您嘗試節省空間並壓縮數據,爲什麼不直接對齊(1)? – 2011-02-27 16:35:49
這不是關於節省空間,而是關於爲任意類型分配堆棧空間以及尊重該類型的對齊要求。第二塊代碼就是這麼做的,我只是想知道是否(通常情況下)有更好的方法來做到這一點。 – JBeFat 2011-02-27 17:42:28