ニュースを見て、調べたい:
- なぜ右に金メダルがあるのですか?
- クロスプラットフォームSIMDはどうですか?
- 4000を2月の最終金曜日で割るとどうなりますか?
- コルーチンの落とし穴は何ですか?
- マルチスレッドプログラミング用のクールなチップは近日中に利用可能になりますか?
カレンダーとタイムゾーン
C ++ 20で日付がいかに美しく簡単に設定できるかをご覧ください。
using std::chrono; year_month_day ymd = 2016y/May/29d; // 2016-05-29
, ? :
auto tp = sys_days{ymd} + 7h + 30min + 6s + 153ms; // 2016-05-29 07:30:06.153 UTC zoned_time zt = {"Asia/Tokyo", tp}; cout << zt << '\n'; // 2016-05-29 16:30:06.153 JST
, , « », « » « ». ..
4000 :
auto last_friday_feb = February/Friday[last]; std::cout << 4000 / last_friday_feb << std::endl;
.
Span
std::string_view C++17 ( boost::string_view/boost::string_ref), std::span !
, , - int:
void do_something(int* p, size_t size);
:
std::vector<int> v; do_something(v.data(), v.size()); int data[1024]; do_something(data, std::size(data)); boost::container::small_vector<int, 32> sm; do_something(sm.data(), sm.size());
— + range based for:
void do_something(int* p, size_t size) { std::sort(p, p + size); for (size_t i = 0; i < size; ++i) { p[i] += p[0]; } }
, std::span — , ( , , ). :
void do_something(std::span<int> p) { std2::sort(p); for (int& v: p) { v += p[0]; } } // ... std::vector<int> v; do_something(v); int data[1024]; do_something(data); boost::container::small_vector<int, 32> sm; do_something(sm);
std::span pdf.
typename? C++20!
, typename, – , ! C++20 typename:
template<class T> T::R f(); template<class T> struct S { using Ptr = PtrTraits<T>::Ptr; T::R f(T::P p) { return static_cast<T::R>(p); } auto g() -> S<T*>::Ptr; };
- [[no_unique_address]] — , . , .
- [[likely]] — ( `if (flag){ [[likely]] std::cout << «OK»; }` ) case switch, , , , .
- [[unlikely]] — , .
onstexpr
– std::allocator constexpr . , – C++20 std::vector std::string, . , , .
, . , , 21 «constexpr iterator», , . constexpr .
, , , Herb Sutter “Meta: Thoughts on generative C++”.
«Parallelism 2 TS». , , SIMD , . (SSE, AVX, NEON, MDMX ..):
void compute_on_aligned_data(float* data, size_t N) { size_t i = 0; for (; i + native_simd<float>::size() <= N; i += native_simd<float>::size()) { native_simd<float> v(data + i, vector_aligned); where(v > 100.f, v) = 100.f + (v - 100.f) * 0.1f; v.copy_to(data + i, vector_aligned); } for (; i < N; ++i) { float x = data[i]; if (x > 100.f) { x = 100.f + (x - 100.f) * 0.1f; } data[i] = x; } }
SIMD .
( fork based , , ..) .
.
, promise. , . , , :
future<std::string> concat(const std::string& prefix, future<std::string> suffix) { co_return (prefix + co_await suffix); }
, . . , .
Reflection TS
TS . . .
, C++, .
C++. , WG21, .
. C++ . Houdini, , C++ C++11.
. - C++ , https://stdcpp.ru/, 21 .
? C++ Russia .
C++ ? , memory_order_relaxed memory_order_seq_cst.
, C++20 .