Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
コンテナと文字列の中間インタフェースspanとstring_view
Search
Akira Takahashi
June 15, 2024
Programming
1
380
コンテナと文字列の中間インタフェースspanとstring_view
Akira Takahashi
June 15, 2024
Tweet
Share
More Decks by Akira Takahashi
See All by Akira Takahashi
C++26 エラー性動作
faithandbrave
2
900
C++20の整数
faithandbrave
0
100
C++23 スタックトレースライブラリ
faithandbrave
0
350
if constexpr文はテンプレート世界のラムダ式である
faithandbrave
3
1k
使いたい標準C++機能がない環境でいかに実装・設計するか
faithandbrave
2
1k
C++20からC++23までの変化
faithandbrave
9
12k
オープン化が進むC++の現状と展望
faithandbrave
19
11k
C++20 status
faithandbrave
0
910
Other Decks in Programming
See All in Programming
Fixstars高速化コンテスト2024準優勝解法
eijirou
0
190
アクターシステムに頼らずEvent Sourcingする方法について
j5ik2o
6
700
毎日13時間もかかるバッチ処理をたった3日で60%短縮するためにやったこと
sho_ssk_
1
550
Alba: Why, How and What's So Interesting
okuramasafumi
0
210
HTML/CSS超絶浅い説明
yuki0329
0
190
快速入門可觀測性
blueswen
0
500
週次リリースを実現するための グローバルアプリ開発
tera_ny
1
1.2k
PHPで作るWebSocketサーバー ~リアクティブなアプリケーションを知るために~ / WebSocket Server in PHP - To know reactive applications
seike460
PRO
2
770
DevinとCursorから学ぶAIエージェントメモリーの設計とMoatの考え方
itarutomy
0
140
AWSのLambdaで PHPを動かす選択肢
rinchoku
2
390
非ブラウザランタイムとWeb標準 / Non-Browser Runtimes and Web Standards
petamoriken
0
430
見えないメモリを観測する: PHP 8.4 `pg_result_memory_size()` とSQL結果のメモリ管理
kentaroutakeda
0
930
Featured
See All Featured
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
The Pragmatic Product Professional
lauravandoore
32
6.4k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.3k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.8k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
How to Ace a Technical Interview
jacobian
276
23k
Optimising Largest Contentful Paint
csswizardry
33
3k
Into the Great Unknown - MozCon
thekraken
34
1.6k
Being A Developer After 40
akosma
89
590k
Speed Design
sergeychernyshev
25
740
GitHub's CSS Performance
jonrohan
1030
460k
Transcript
ίϯςφɾจࣈྻͷதؒΠϯλϑΣʔε TQBOͱTUSJOH@WJFX ߴڮ থ "LJSB5BLBIBTIJ GBJUIBOECSBWF!HNBJMDPN 1SFGFSSFE/FUXPSLT *OD ۚ
$ .*9
৽ඪ४ɿίϯςφͱจࣈྻͷड͚औΓํ • $ Ͱೖͬͨstd::spanίϯςφΛड͚औΔͨΊͷܕ • $ Ͱೖͬͨstd::string_viewจࣈྻΛड͚औΔͨΊͷܕ • ͜ΕΒৗతʹ͏ϢʔςΟϦςΟͰ͕͢ɺ᠘͋Γ·͢ •
Ұஈ֊ϥοϓ͢Δ͜ͱͰɺΑΓศརʹͳΔέʔε͋Γ·͢ • ৽ͨͳͨΓલͱͳΔ࡞๏ΛֶΜͰ͍͖·͠ΐ͏
TQBO $ void process(span<int> data) { for (int
x : data) { println("{}", x); } } vector<int> v = {1, 2, 3}; int ar[] = {4, 5, 6}; process(span<int>{v}); // 明示的な変換が必要 process(ar); • TQBOɺϝϞϦ࿈ଓੑͷ͋Δίϯςφ WFDUPSྻ Λ ڞ௨ͯ͠ड͚औΔΠϯλϑΣʔεͱͯ͠༻Ͱ͖Δܕ • ॴ༗ݖΛͨͣɺઌ಄ཁૉͷϙΠϯλͱαΠζ͚ͩΛͭ
TQBO $ void process(span<int> data) { // 一部配列を取り出したりしても要素のコピーが発生しない
process_header(data.front()); process_body(span{data.begin() + 1, data.end()}); } • ཁૉͷίϐʔ͕ൃੜ͠ͳ͍ͷͰɺؾܰʹ෦ྻͷૢ࡞͕Ͱ͖Δ • ͨͩ͠ɺॴ༗ݖΛ͓ͬͯΒͣ σʔλࢀর͍ͯ͠Δ͚ͩ ࣋ͪӡͼʹ͔ͳ͍ͷͰҙ
TUSJOH@WJFX $ void process(string_view sv) { println("{}", sv.substr(1, 3));
} process("Hello"); process(string{"World"}); • string_viewɺจࣈྻͱstringͷڞ௨ΠϯλϑΣʔε • จࣈྻʹରͯ͠stringͷศརͳϝϯόؔΛ͑Δ • ཁૉͷίϐʔϝϞϦ֬อ͕ൃੜ͠ͳ͍ͷͰ ෦จࣈྻͷૢ࡞ؾܰʹͰ͖Δ • ॴ༗ݖΛͨͳ͍ͷͰɺ࣋ͪӡͼʹ͋·Γ͔ͳ͍ • จࣈྻϦςϥϧTUBUJDͳण໋ΛͭͷͰɺͱͯ͠จࣈྻϦςϥϧΛ ͭ߹࣋ͪӡΔ
᠘ͦͷ෦ྻͰඌ͕ͣΕΔ void f(const char* s) { cout << s <<
endl; } void process(string_view sv) { f(sv.substr(1, 3).data()); } process("Hello"); // 「ell」を期待するが「ello」が出力される • const char*ͰจࣈྻΛड͚औΔؔʹ෦จࣈྻΛ͢ͱ Γൈ͍ͨൣғͰͳ͘ඌ·Ͱͬͯ͠·͏ • f(const char* s, int size)ܗࣜʹͳ͍ͬͯͳ͍ͱࠔΔ • ͦͷΑ͏ͳঢ়گͰɺҰ୴TUSJOHʹมͨ͠Γ͢Δඞཁ͕͋Δ • ͘͠ɺඌΛΕͳ͍Α͏҆શʹϥοϓ͢Δ͜ͱߟ͑ΒΕΔ
᠘ͦͷ࣋ͪӡͼʹ͍͘ class X { vector<int> _data; public: // こういう使い方はOK span<int>
f() { return {_data.begin() + 1, _data.end()}; } // コンパイルは通るけど寿命切れ span<int> g() { vector<int> x = {1, 2, 3}; return {x.begin() + 1, x.end()}; } }; • spanͱstring_view ॴ༗ݖΛͨͳ͍ͷ Ͱ࣋ͪӡͼʹ͍͘ • ؔͷΓܕʹ ͠ʹ͍͘͠ɺϝϯό มͱͯͭ͠ͷ Ή͔͍ͣ͠
ॴ༗ݖΛPQUJPOBM লུՄ ʹͨͤΔ֦ு life_string_view f(life_string_view sv) { return sv.substr(1, 3);
} life_string_view g() { string s = "Hello"; return f(life_string_view::allocate(move(s))); } • string_viewܰྔͩ͠ɺ͍͍ͩͨͷσʔλจࣈྻϦςϥϧ TUBUJDͳण໋ ͔ͩΒɺͰ͖Εstring_viewͰ࣋ͪӡͼ͍ͨ • ͚ͩͲͨ·ʹจࣈྻϑΥʔϚοτͨ͠จࣈྻΛ͍࣋ͨͤͨ • ͜͏͍͏߹ͷͨΊʹɺॴ༗ݖΛͭΦϒδΣΫτΛPQUJPOBMʹ࣋ ͨͤΔ֦ு͕ߟ͑ΒΕΔ
ॴ༗ݖΛPQUJPOBM লུՄ ʹͨͤΔ֦ு struct life_string_view { std::string_view _data; std::shared_ptr<void> _life;
template <class T> static life_string_view allocate(T&& data) { auto p = std::make_shared<T>(std::forward<T>(data)); return {*p, p}; } …string_viewと同じメンバ関数を実装… • shared_ptr<void>Ͱॴ༗ݖΛ͍ͬ͠ΐʹ࣋ͪӡͿ • ॴ༗ݖΛͨ͞ͳ͚Εۭͷshared_ptr ϙΠϯλͱBUPNJDࢀরΧ ϯτ ͚ͩ༨ʹͭ
ิ • string_viewʹॴ༗ݖΛͨͤΔΞΠσΟΞɺBTZOD@NRUUϥ ΠϒϥϦ ۙ౻وढ़͞Μ࡞ Ͱ࣮ࡍʹΘΕ͍ͯ·͢ • IUUQTHJUIVCDPNSFECPMU[BTZOD@NRUUCMPCCGBEB EGFBCFCFFGBJODMVEFBTZOD@NRUUVUJMCVGGFS IQQ
• spanͱstring_view$ ͷ৽ৗࣝͱͯ͠ৗతʹΘΕ͍ͯ ͘͜ͱʹͳΓ·͕͢ɺؕΓ͍͢᠘͋Γ·͢ • ࡞๏Λʹ͚ͭͯɺ҆શʹ͍͖ͬͯ·͠ΐ͏ • ˎ ྻΛଟ࣍ݩྻͱͯ͠ΞΫηεͰ͖ΔΑ͏ʹ͢Δmdspan ͋Γ·͢ ઢܗϥΠϒϥϦͰଟ༻͍ͯ͘͜͠ͱʹͳΔ