問題タブ [alignas]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - alignas 指定子: 型について / メンバー データについて
次の 2 つのケースは、すべての状況で同等ですか?
1)alignas
タイプについて
2)alignas
メンバー配列
c++ - 演算子 new(sizeof(T) * N) によって返されたメモリを配列として扱う
C では、動的配列を使用して割り当ててmalloc(sizeof(T) * N)
から、ポインター演算を使用して、この動的配列の i オフセットにある要素を取得できます。
C++ ではoperator new()
、同じ方法で同じように使用して、malloc()
新しい配置を行うことができます (たとえば、Herb Sutter による本「Exceptional C++: 47 engineering puzzles, programming problems, and solutions」の項目 13 の解決策を見ることができます)。持っていない場合、この質問の解決策の要約は次のようになります。
サイズ = の N 個の整列された要素を保持するのに十分なメモリを備えたメモリのチャンクを求めているので、私にとってこれは正当に見えましたsizeof(T)
。sizeof(T)
整列された要素のサイズを返す必要があり、それらはメモリのチャンクに次々と配置されるため、ここではポインター演算を使用しても問題ありません。
しかし、私は次のようなリンクを指摘されました: http://eel.is/c++draft/expr.add#4またはhttp://eel.is/c++draft/intro.object#def:objectと主張C++operator new()
では配列オブジェクトを返さないため、返されたものに対するポインター演算とそれを配列として使用することは、ANSI C とは対照的に未定義の動作です。
私はそのような低レベルのものが得意ではなく、これを読んで理解しようとしています: https://www.ibm.com/developerworks/library/pa-dalign/またはこれ: http://jrruethe. github.io/blog/2015/08/23/placement-new/しかし、Sutter が単純に間違っていたのか、まだ理解できませんか?
alignas
次のような構造では意味があることを理解しています。
(c) http://geordeflanagin.com/alignas.php
配列が境界内にないように見える場合double
(おそらくchar
、2 バイト読み取りプロセッサで実行された構造体に続く)。
しかし、これは違います - 私はヒープ/空きストレージからメモリを要求しましたsizeof(T)
。
これが TL;DR の場合に要約すると:
malloc()
C++ で動的配列を使用することは可能ですか?- キーワード
operator new()
のない古い C++ で動的配列に newを使用して配置することは可能ですか?alignas
- によって返されるメモリ上で使用される場合、ポインター演算は未定義の動作
operator new()
ですか? - Sutter は古いマシンで壊れる可能性のあるコードをアドバイスしていますか?
これがばかげている場合は申し訳ありません。