2011-11-27 32 views
5

stl,boost或其他LGPL開源工具包中的模板的行爲是否如下所示: -
- 具有自定義對齊的相對指針,用於存儲更少位以減少範圍的選項。 一個可能的實現來說明: -緊湊偏移指針,現有的實現?

template<typename T, typename OFFSET=int, 
    int ALIGN_SHIFT=2> 
class OffsetPtr 
{ 
    OFFSET ofs; 

public: 
    T* operator->() { 
     return (T*) (((((size_t)this)>>ALIGN_SHIFT)+ofs)<<ALIGN_SHIFT); 
    }; 
    void operator=(T* src) { 
     size_t ofs_shifted = (((size_t) src)>>ALIGN_SHIFT) - (((size_t) this)>>ALIGN_SHIFT); //asserts.. 
     ofs = (OFFSET) (ofs_shifted); 
    } 
    //... 
}; 

它的東西,我會過去經常創造(緊湊型緩存友好預編譯的數據結構),例如將數據分解爲小於128k的塊OFFSET = short
我在古代C#定義中使用的另一種變體將使用標題中的偏移量,其中對齊將更有用。

我已經看到一些關於「間圖書館」在具有「offset_ptr」,看起來非常相似的提升,所以它很可能有一個現有的執行,包括這個確切的模式地方。 它的快速寫,但有可能是像一套圍繞着同一個概念建立相關的STL兼容的數據結構的現有實現的好處 - 一個「近矢量」與16位偏移指針&例如16位計數

+0

Boost的'offset_ptr <>'與您想要的不同 - 它存儲偏移指針本身的地址和指向對象的地址之間的距離,而不是允許任意偏移量。就我個人而言,我認爲它名字不好。 'relative_ptr <>'會更合適。 – ildjarn

+0

當然,就像'相對尋址'一樣。我通常會把它叫做抵消,所以我也可以這麼做 - 儘管也許我可以稱之爲'相對'來區分它與提升',好的建議。 –

回答

2

如果」重新使用Visual C++,您可能會喜歡使用__based pointers

+0

謝謝。我不知道那是存在的。可悲的是,我必須避免MS特定的擴展,因爲我主要用gcc和llvm進行編譯,不知道C++ 11是否有類似的東西。在asm的時代,從低級代碼回來,我通常的方法是從結構基礎本身的偏移,這通常是最方便的。它也可以很好地用作C宏,但上面的實現在C++中非常誘人。 –