Slide 1

Slide 1 text

ίϯςφɾจࣈྻͷதؒΠϯλϑΣʔε TQBOͱTUSJOH@WJFX ߴڮ থ "LJSB5BLBIBTIJ GBJUIBOECSBWF!HNBJMDPN 1SFGFSSFE/FUXPSLT *OD ۚ $.*9

Slide 2

Slide 2 text

৽ඪ४ɿίϯςφͱจࣈྻͷड͚औΓํ • $Ͱೖͬͨstd::span͸ίϯςφΛड͚औΔͨΊͷܕ • $Ͱೖͬͨstd::string_view͸จࣈྻΛड͚औΔͨΊͷܕ • ͜ΕΒ͸೔ৗతʹ࢖͏ϢʔςΟϦςΟͰ͕͢ɺ᠘΋͋Γ·͢ • Ұஈ֊ϥοϓ͢Δ͜ͱͰɺΑΓศརʹͳΔέʔε΋͋Γ·͢ • ৽ͨͳ౰ͨΓલͱͳΔ࡞๏ΛֶΜͰ͍͖·͠ΐ͏

Slide 3

Slide 3 text

TQBO $ void process(span data) { for (int x : data) { println("{}", x); } } vector v = {1, 2, 3}; int ar[] = {4, 5, 6}; process(span{v}); // 明示的な変換が必要 process(ar); • TQBO͸ɺϝϞϦ࿈ଓੑͷ͋Δίϯςφ WFDUPS΍഑ྻ Λ ڞ௨ͯ͠ड͚औΔΠϯλϑΣʔεͱͯ͠࢖༻Ͱ͖Δܕ • ॴ༗ݖΛ΋ͨͣɺઌ಄ཁૉ΁ͷϙΠϯλͱαΠζ͚ͩΛ΋ͭ

Slide 4

Slide 4 text

TQBO $ void process(span data) { // 一部配列を取り出したりしても要素のコピーが発生しない process_header(data.front()); process_body(span{data.begin() + 1, data.end()}); } • ཁૉͷίϐʔ͕ൃੜ͠ͳ͍ͷͰɺؾܰʹ෦෼഑ྻͷૢ࡞͕Ͱ͖Δ • ͨͩ͠ɺॴ༗ݖΛ΋͓ͬͯΒͣ σʔλ͸ࢀর͍ͯ͠Δ͚ͩ ࣋ͪӡͼʹ͸޲͔ͳ͍ͷͰ஫ҙ

Slide 5

Slide 5 text

TUSJOH@WJFX $ void process(string_view sv) { println("{}", sv.substr(1, 3)); } process("Hello"); process(string{"World"}); • string_view͸ɺจࣈ഑ྻͱstringͷڞ௨ΠϯλϑΣʔε • จࣈ഑ྻʹରͯ͠stringͷศརͳϝϯόؔ਺Λ࢖͑Δ • ཁૉͷίϐʔ΍ϝϞϦ֬อ͕ൃੜ͠ͳ͍ͷͰ ෦෼จࣈྻͷૢ࡞΋ؾܰʹͰ͖Δ • ॴ༗ݖΛ΋ͨͳ͍ͷͰɺ࣋ͪӡͼʹ͸͋·Γ޲͔ͳ͍ • จࣈྻϦςϥϧ͸TUBUJDͳण໋Λ΋ͭͷͰɺ஋ͱͯ͠จࣈྻϦςϥϧΛ ΋ͭ৔߹͸࣋ͪӡ΂Δ

Slide 6

Slide 6 text

᠘ͦͷ෦෼഑ྻͰ຤ඌ͕ͣΕΔ 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ʹม׵ͨ͠Γ͢Δඞཁ͕͋Δ • ΋͘͠͸ɺ຤ඌΛ࡟Εͳ͍Α͏҆શʹϥοϓ͢Δ͜ͱ΋ߟ͑ΒΕΔ

Slide 7

Slide 7 text

᠘ͦͷ࣋ͪӡͼʹ͍͘ class X { vector _data; public: // こういう使い方はOK span f() { return {_data.begin() + 1, _data.end()}; } // コンパイルは通るけど寿命切れ span g() { vector x = {1, 2, 3}; return {x.begin() + 1, x.end()}; } }; • spanͱstring_view͸ ॴ༗ݖΛ΋ͨͳ͍ͷ Ͱ࣋ͪӡͼʹ͍͘ • ؔ਺ͷ໭Γ஋ܕʹ͸ ͠ʹ͍͘͠ɺϝϯό ม਺ͱͯ͠΋ͭͷ΋ Ή͔͍ͣ͠

Slide 8

Slide 8 text

ॴ༗ݖΛ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ʹ࣋ ͨͤΔ֦ு͕ߟ͑ΒΕΔ

Slide 9

Slide 9 text

ॴ༗ݖΛPQUJPOBM লུՄ ʹ΋ͨͤΔ֦ு struct life_string_view { std::string_view _data; std::shared_ptr _life; template static life_string_view allocate(T&& data) { auto p = std::make_shared(std::forward(data)); return {*p, p}; } …string_viewと同じメンバ関数を実装… • shared_ptrͰॴ༗ݖΛ͍ͬ͠ΐʹ࣋ͪӡͿ • ॴ༗ݖΛ΋ͨ͞ͳ͚Ε͹ۭͷshared_ptr ϙΠϯλͱBUPNJDࢀরΧ ΢ϯτ ͚ͩ༨෼ʹ΋ͭ

Slide 10

Slide 10 text

ิ଍ • string_viewʹॴ༗ݖΛ΋ͨͤΔΞΠσΟΞ͸ɺBTZOD@NRUUϥ ΠϒϥϦ ۙ౻وढ़͞Μ࡞ Ͱ࣮ࡍʹ࢖ΘΕ͍ͯ·͢ • IUUQTHJUIVCDPNSFECPMU[BTZOD@NRUUCMPCCGBEB EGFBCFCFFGBJODMVEFBTZOD@NRUUVUJMCVGGFS IQQ • spanͱstring_view͸$ͷ৽ৗࣝͱͯ͠೔ৗతʹ࢖ΘΕ͍ͯ ͘͜ͱʹͳΓ·͕͢ɺؕΓ΍͍͢᠘΋͋Γ·͢ • ࡞๏Λ਎ʹ͚ͭͯɺ҆શʹ࢖͍͖ͬͯ·͠ΐ͏ • ˎ ഑ྻΛଟ࣍ݩ഑ྻͱͯ͠ΞΫηεͰ͖ΔΑ͏ʹ͢Δmdspan΋ ͋Γ·͢ ઢܗ୅਺ϥΠϒϥϦͰଟ༻͍ͯ͘͜͠ͱʹͳΔ