最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ Boost Flyweight庫使用介紹

 更新時間:2022年12月05日 10:51:02   作者:無水先生  
Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱

一、說明

以下庫用于設(shè)計模式。

  • Boost.Flyweight 有助于在程序中使用許多相同的對象并且需要減少內(nèi)存消耗的情況。
  • Boost.Signals2 使得使用觀察者設(shè)計模式變得容易。這個庫被稱為 Boost.Signals2 因為它實現(xiàn)了信號/槽的概念。
  • Boost.MetaStateMachine 使得將狀態(tài)機(jī)從 UML 轉(zhuǎn)移到 C++ 成為可能。

本節(jié)內(nèi)容

66. Boost.Flyweight

67. Boost.Signals2

68. Boost.MetaStateMachine

二、庫Boost.Flyweight

Boost.Flyweight 

Boost.Flyweight 是一個可以輕松使用同名設(shè)計模式的庫。當(dāng)許多對象共享數(shù)據(jù)時,享元有助于節(jié)省內(nèi)存。使用這種設(shè)計模式,不是在對象中多次存儲相同的數(shù)據(jù),而是將共享數(shù)據(jù)保存在一個地方,所有對象都引用該數(shù)據(jù)。雖然您可以使用例如指針來實現(xiàn)此設(shè)計模式,但使用 Boost.Flyweight 更容易。

示例 66.1。沒有 Boost.Flyweight 的十萬個相同的字符串

#include <string>
#include <vector>
struct person
{
  int id_;
  std::string city_;
};
int main()
{
  std::vector<person> persons;
  for (int i = 0; i < 100000; ++i)
    persons.push_back({i, "Berlin"});
}

Example 66.1 

示例 66.1 創(chuàng)建了十萬個 person 類型的對象。 person 定義了兩個成員變量:id_ 標(biāo)識人,city_ 存儲人們居住的城市。在這個例子中,所有人都住在柏林。這就是為什么 city_ 在所有十萬個對象中都設(shè)置為“Berlin”。因此,該示例使用十萬個字符串,所有字符串都設(shè)置為相同的值。使用 Boost.Flyweight,可以使用一個字符串——而不是數(shù)千個——并且可以減少內(nèi)存消耗。

示例 66.2。使用 Boost.Flyweight 一個字符串而不是十萬個字符串

#include <boost/flyweight.hpp>
#include <string>
#include <vector>
#include <utility>
using namespace boost::flyweights;
struct person
{
  int id_;
  flyweight<std::string> city_;
  person(int id, std::string city) : id_{id}, city_{std::move(city)} {}
};
int main()
{
  std::vector<person> persons;
  for (int i = 0; i < 100000; ++i)
    persons.push_back({i, "Berlin"});
}

要使用 Boost.Flyweight,請包含 boost/flyweight.hpp,如示例 66.2 所示。 Boost.Flyweight 提供了額外的頭文件,僅當(dāng)您需要更改詳細(xì)的庫設(shè)置時才需要包含這些頭文件。

所有類和函數(shù)都在命名空間 boost::flyweights 中。示例 66.2 僅使用類 boost::flyweights::flyweight,這是該庫中最重要的類。成員變量 city_ 使用類型 flyweight<std::string> 而不是 std::string。這是您需要更改的所有內(nèi)容,以使用此設(shè)計模式并減少程序的內(nèi)存需求。

示例 66.3。多次使用 boost::flyweights::flyweight

#include <boost/flyweight.hpp>
#include <string>
#include <vector>
#include <utility>
using namespace boost::flyweights;
struct person
{
  int id_;
  flyweight<std::string> city_;
  flyweight<std::string> country_;
  person(int id, std::string city, std::string country)
    : id_{id}, city_{std::move(city)}, country_{std::move(country)} {}
};
int main()
{
  std::vector<person> persons;
  for (int i = 0; i < 100000; ++i)
    persons.push_back({i, "Berlin", "Germany"});
}

Example 66.3 

示例 66.3 向類 person 添加了第二個成員變量 country_。這個成員變量包含人們居住的國家的名字。因為在這個例子中,所有人都住在柏林,所以他們都住在同一個國家。這就是為什么在成員變量 country_ 的定義中也使用了 boost::flyweights::flyweight。

Boost.Flyweight 使用一個內(nèi)部容器來存儲對象。它確保不能有多個具有相同值的對象。默認(rèn)情況下,Boost.Flyweight 使用哈希容器,例如 std::unordered_set。對于不同的類型,使用不同的散列容器。與示例 66.3 一樣,成員變量 city_ 和 country_ 都是字符串;因此,只使用一個容器。在此示例中,這不是問題,因為容器僅存儲兩個字符串:“Berlin”和“Germany”。如果必須存儲許多不同的城市和國家,最好將城市存儲在一個容器中,將國家存儲在另一個容器中。

示例 66.4。多次使用 boost::flyweights::flyweight 標(biāo)簽

#include <boost/flyweight.hpp>
#include <string>
#include <vector>
#include <utility>
using namespace boost::flyweights;
struct city {};
struct country {};
struct person
{
  int id_;
  flyweight<std::string, tag<city>> city_;
  flyweight<std::string, tag<country>> country_;
  person(int id, std::string city, std::string country)
    : id_{id}, city_{std::move(city)}, country_{std::move(country)} {}
};
int main()
{
  std::vector<person> persons;
  for (int i = 0; i < 100000; ++i)
    persons.push_back({i, "Berlin", "Germany"});
}

示例 66.4 將第二個模板參數(shù)傳遞給 boost::flyweights::flyweight。這是一個標(biāo)簽。標(biāo)簽是任意類型,僅用于區(qū)分 city_ 和 country_ 所基于的類型。示例 66.4 定義了兩個空結(jié)構(gòu)城市和國家,用作標(biāo)簽。但是,該示例可以改為使用 int、bool 或任何類型。

標(biāo)簽使 city_ 和 country_ 使用不同的類型。現(xiàn)在 Boost.Flyweight 使用了兩個哈希容器——一個存儲城市,另一個存儲國家。

示例 66.5。 boost::flyweights::flyweight 的模板參數(shù)

#include <boost/flyweight.hpp>
#include <boost/flyweight/set_factory.hpp>
#include <boost/flyweight/no_locking.hpp>
#include <boost/flyweight/no_tracking.hpp>
#include <string>
#include <vector>
#include <utility>
using namespace boost::flyweights;
struct person
{
  int id_;
  flyweight<std::string, set_factory<>, no_locking, no_tracking> city_;
  person(int id, std::string city) : id_{id}, city_{std::move(city)} {}
};
int main()
{
  std::vector<person> persons;
  for (int i = 0; i < 100000; ++i)
  persons.push_back({i, "Berlin"});
}

標(biāo)簽以外的模板參數(shù)可以傳遞給 boost::flyweights::flyweight。示例 66.5 通過 boost::flyweights::set_factory、boost::flyweights::no_locking 和 boost::flyweights::no_tracking。包含額外的頭文件以使用這些類。

boost::flyweights::set_factory 告訴 Boost.Flyweight 使用排序容器,例如 std::set,而不是散列容器。使用 boost::flyweights::no_locking,通常默認(rèn)激活的對多線程的支持被停用。 boost::flyweights::no_tracking 告訴 Boost.Flyweight 不要跟蹤存儲在內(nèi)部容器中的對象。默認(rèn)情況下,當(dāng)不再使用對象時,Boost.Flyweight 會檢測到這一點并將它們從容器中移除。當(dāng)設(shè)置了 boost::flyweights::no_tracking 時,檢測機(jī)制被禁用。這提高了性能。但是,容器只能增長,永遠(yuǎn)不會收縮。

Boost.Flyweight 支持額外的設(shè)置。如果您對調(diào)整的更多細(xì)節(jié)感興趣,請查看官方文檔。

煉習(xí)

使用 Boost.Flyweight 改進(jìn)這個程序。使用禁用多線程支持的 Boost.Flyweight:

#include <string>
#include <vector>
#include <memory>
int main()
{
    std::vector<std::shared_ptr<std::string>> countries;
    auto germany = std::make_shared<std::string>("Germany");
    for (int i = 0; i < 500; ++i)
        countries.push_back(germany);
    auto netherlands = std::make_shared<std::string>("Netherlands");
    for (int i = 0; i < 500; ++i)
        countries.push_back(netherlands);
}

到此這篇關(guān)于C++ Boost Flyweight庫使用介紹的文章就介紹到這了,更多相關(guān)C++ Boost Flyweight內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中l(wèi)ist的用法實例講解

    C++中l(wèi)ist的用法實例講解

    list是順序容器的一種,list是一個雙向鏈表,使用list需要包含頭文件list,這篇文章主要給大家介紹了關(guān)于C++中l(wèi)ist的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11
  • 一文搞懂C++中的運(yùn)算符重載

    一文搞懂C++中的運(yùn)算符重載

    這篇文章主要為大家詳細(xì)介紹了C++中的運(yùn)算符重載的相關(guān)資料,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C++有一定幫助,需要的可以參考一下
    2022-09-09
  • C++深入探究引用的本質(zhì)與意義

    C++深入探究引用的本質(zhì)與意義

    引用是C++一個很重要的特性,顧名思義是某一個變量或?qū)ο蟮膭e名,對引用的操作與對其所綁定的變量或?qū)ο蟮牟僮魍耆葍r,這篇文章主要給大家總結(jié)介紹了C++中引用的相關(guān)知識點,需要的朋友可以參考下
    2022-04-04
  • C++中可以接受任意多個參數(shù)的函數(shù)定義方法(詳解)

    C++中可以接受任意多個參數(shù)的函數(shù)定義方法(詳解)

    下面小編就為大家?guī)硪黄狢++中可以接受任意多個參數(shù)的函數(shù)定義方法(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • C語言解決螺旋矩陣算法問題的代碼示例

    C語言解決螺旋矩陣算法問題的代碼示例

    這篇文章主要介紹了C語言解決螺旋矩陣算法問題的代碼示例,螺旋矩陣中的數(shù)字由第一行開始到右邊不斷變大,向下變大,向左變大,向上變大,如此循環(huán)...需要的朋友可以參考下
    2016-04-04
  • C語言數(shù)據(jù)結(jié)構(gòu)之模式匹配字符串定位問題

    C語言數(shù)據(jù)結(jié)構(gòu)之模式匹配字符串定位問題

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之模式匹配字符串定位問題的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • epoll封裝reactor原理剖析示例詳解

    epoll封裝reactor原理剖析示例詳解

    這篇文章主要為大家介紹了epoll封裝reactor原理剖析示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • C++實現(xiàn)簡易貪吃蛇游戲

    C++實現(xiàn)簡易貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)簡易貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Clion下vcpkg的使用詳解

    Clion下vcpkg的使用詳解

    這篇文章主要介紹了Clion下vcpkg的使用詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • C/C++實現(xiàn)目錄監(jiān)視器的方法詳解

    C/C++實現(xiàn)目錄監(jiān)視器的方法詳解

    這篇文章主要介紹了C/C++ 實現(xiàn)目錄監(jiān)視器的方法,然后網(wǎng)上查到的基本就有三種方法,使用FindFirstChangeNotification等系列函數(shù),使用ReadDirectoryChangesW函數(shù)和使用change journals,本文使用了第二種方式來實現(xiàn)一個目錄監(jiān)視,需要的朋友可以參考下
    2024-04-04

最新評論

麦盖提县| 略阳县| 威远县| 林西县| 保康县| 昌吉市| 崇礼县| 安康市| 兴山县| 梁平县| 松溪县| 沅江市| 烟台市| 遵义市| 雅安市| 阜康市| 仁怀市| 巴林左旗| 旬阳县| 调兵山市| 冕宁县| 泉州市| 桃源县| 腾冲县| 霸州市| 扎鲁特旗| 阳高县| 凉城县| 苏尼特左旗| 亳州市| 通许县| 阿克陶县| 迁西县| 三穗县| 法库县| 定安县| 公安县| 肃北| 句容市| 明溪县| 华蓥市|