<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 具有作用域的內存分配器 為了使容器對象小巧和簡單起見,C++98沒有要求容器支持具有狀態的內存分配器,即不用把分配器對象存儲在容器對象中。在C++11中,這仍然默認做法。但是,在C++0x中,也可以使用具有狀態的內存分配器:這種內存分配器擁有一個指向分配區域的指針。例如: ``` template<class T> class Simple_alloc { // C++98 style // no data // usual allocator stuff }; class Arena { void* p; int s; public: Arena(void* pp, int ss); // allocate from p[0..ss-1] }; template<class T> struct My_alloc { Arena& a; My_alloc(Arena& aa) : a(aa) { } // usual allocator stuff }; Arena my_arena1(new char[100000],100000); Arena my_arena2(new char[1000000],1000000); vector<int> v0; // allocate using default allocator vector<int,My_alloc<int>> v1(My_alloc<int>{my_arena1}); // allocate from my_arena1 vector<int,My_alloc<int>> v2(My_alloc<int>{my_arena2}); // allocate from my_arena2 vector<int,Simple_alloc<int>> v3; // allocate using Simple_alloc ``` 通常我們可以使用typedef來簡化上述例子中繁冗的表達。 雖然并不能保證默認內存分配器和Simple_alloc不在一個vector對象中占用空間,但是在實現庫的時候可以使用一些模板的元程序設計方法來做到這點。因此,如果對象擁有狀態的話(比如My_alloc),內存分配器將會帶來一定的空間開銷。 在同時使用容器和用戶自定義內存分配器時存在一個更為隱蔽的問題:一個內存分配器成員是否應該和它的容器處于相同的分配區域中?例如,你使用 Your_allocator來給Your_string的成員分配內存,而我用My_allocator來給My_vector的成員分配內存。在這種 情況下,My_vector會使用哪個分配器。要解決這問題的話就需要告訴容器使用什么分配器來傳遞成員。下面的例子將給出實現這一點的方法。在這個例子 中我將使用分配器My_alloc來分配vector成員和string成員。首先,我必須要有一個能夠接受My_alloc對象的string版本: ``` //使用My_alloc的一個string類型 using xstring = basic_string<char, char_traits<char>, My_alloc<char>>; ``` 然后,我要有一個能夠接受這種string類型以及My_alloc對象的vector版本。同時,該vector版本需要能夠把My_alloc對象傳遞給string。 ``` using svec = vector<xstring,scoped_allocator_adaptor<My_alloc<xstring>>>; ``` 最后,我們可以按照下面的示例實現My_alloc類型的分配器: ``` svec v(svec::allocator_type(My_alloc{my_arena1})); ``` 在此,svec是一個成員為string類型的vector,并且該vector使用My_alloc來為其string類型的成員分配內存。另外,標準 庫中新提供了”adaptor” (“wrapper type”) scoped_allocator_adaptor。它可以用來指明使用My_alloc來為string類型變量分配內存。需要注意的 是,scoped_allocator_adaptor可以將My_alloc轉換為My_alloc。而這正是xstring所需要提供的功能。 于是,我們又有了4種可用于替換的方法: ``` // vector and string use their own (the default) allocator: using svec0 = vector<string>; svec0 v0; // vector (only) uses My_alloc and string uses its own (the default) allocator: using svec1 = vector<string,My_alloc<string>>; svec1 v1(My_alloc<string>{my_arena1}); // vector and string use My_alloc (as above): using xstring = basic_string<char, char_traits<char>, My_alloc<char>>; using svec2 = vector<xstring,scoped_allocator_adaptor<My_alloc<xstring>>>; svec2 v2(scoped_allocator_adaptor<My_alloc<xstring>>{my_arena1}); // vector uses My_alloc and string uses My_string_alloc: using xstring2 = basic_string<char, char_traits<char>, My_string_alloc<char>>; using svec3 = vector<xstring2,scoped_allocator_adaptor<My_alloc<xstring>, My_string_alloc<char>>>; svec3 v3(scoped_allocator_adaptor<My_alloc<xstring2>, My_string_alloc<char>>{my_arena1,my_string_arena}); ``` 很明顯,第一種方法svec0是最常用的。但是在內存會嚴重影響性能的系統中,其它版本(特別是svec2)將會顯得尤為重要。當然了,我們可以使用一些 typedef來增強代碼的可讀性。不過還好,畢竟你不用每天都寫這些。另外,我們提供了scoped_allocator_adaptor2的一個變 種:scoped_allocator_adaptor2。它用于兩個非默認內存分配器不一樣的情況。 同時可參考: * Standard: 20.8.5 Scoped allocator adaptor [allocator.adaptor] * Pablo Halpern: [The Scoped Allocator Model (Rev 2)](http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2554.pdf). N2554=08-0064. (翻譯:Yibo Zhu)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看