X



C++相談室 part135
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 5fcb-q1Nq)
垢版 |
2018/03/31(土) 20:20:06.25ID:o3PNwIlC0
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part134
http://mevius.5ch.net/test/read.cgi/tech/1516406742/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1509780815/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0248デフォルトの名無しさん (ワッチョイ 9a91-Aj1d)
垢版 |
2018/04/23(月) 22:42:58.69ID:7US5BnQm0
舌足らずですみません。コードはこんな感じです。
threadFunctionは単なる加算値、joinFunctionは集計処理です。
コアは物理2論理4です。
template< class ArgType >
void Reduce( std::vector< ArgType >& threadArgs, void* (*threadFunction)(void*), void (*joinFunction)(std::vector< ArgType >&) )
{
const size_t threadCount = threadArgs.size();
threads.resize( threadCount );
std::vector< void* > voidPtrArgs = CastArgsToVoidPtrs( threadArgs );
for ( int threadIndex = 0; threadIndex < threadCount; ++threadIndex )
{
sched_param schedParam;
schedParam.sched_priority = sched_get_priority_max( SCHED_FIFO );

pthread_attr_t threadAttribute;
pthread_attr_init( & threadAttribute );
pthread_attr_setschedpolicy( & threadAttribute, schedPolicy );
pthread_attr_setinheritsched( & threadAttribute, PTHREAD_EXPLICIT_SCHED );

pthread_t& thread = threads[ threadIndex ];
pthread_setschedparam( thread, schedPolicy, & schedParam );
pthread_create( & thread, & threadAttribute, threadFunction, voidPtrArgs[ threadIndex ] );
}

for ( int threadIndex = 0; threadIndex < threadCount; ++threadIndex )
{
pthread_t thread = threads[ threadIndex ];
pthread_join( thread, NULL );
}
joinFunction( threadArgs );
}
0249デフォルトの名無しさん (ワッチョイ 0e8a-HDkP)
垢版 |
2018/04/23(月) 22:45:44.01ID:reOPAGg30
>>243
この世界では、何かやって思い描いてたようにならなかった場合
まず自分の能力不足を疑うのが鉄則
0250デフォルトの名無しさん (ワッチョイ 0e8a-HDkP)
垢版 |
2018/04/23(月) 22:51:38.20ID:reOPAGg30
>>248
アハハハハ!ジョークのつもりかなんか?
そうじゃないならjoinの動きを勉強しろ
0254デフォルトの名無しさん (ワッチョイ 0e8a-HDkP)
垢版 |
2018/04/23(月) 23:20:18.71ID:reOPAGg30
考えたらjoinの問題じゃないか
もし「単なる加算処理」が1スレッドでメモリ帯域使い潰していたらマルチスレッドにしてもどうしようもないのは明らかだよ
0255デフォルトの名無しさん (ワッチョイ 0e8a-fvqh)
垢版 |
2018/04/23(月) 23:21:31.95ID:reOPAGg30
>>253
未だに関数ポインタなんて使ってるほうがやばい
0257デフォルトの名無しさん (ワッチョイ 0e8a-HDkP)
垢版 |
2018/04/23(月) 23:35:26.41ID:reOPAGg30
ダメってわけじゃないけどさあw
C++ならもっと柔軟性のあるやりかたが幾らでもあるってこと
0263はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b66f-9jjH)
垢版 |
2018/04/24(火) 00:06:56.48ID:VhsA5JFS0
忘れがちなことだが std::function は実行時の型を扱う。
画像処理などのようにヘビーな繰返しがあるような場面では関数ポインタを使った場合との間に深刻な速度差が生じることもなくはない。
0264デフォルトの名無しさん (ワッチョイ 7acb-BC+p)
垢版 |
2018/04/24(火) 00:16:24.07ID:qFc5rpEV0
>>248
関数名からして、一度のreduce処理量は大したことなくて、何度も繰り返し呼んでない?
thread処理に必要な処理量が相対的に無視できなくなってるんじゃね?
スレッドは4本に制限して、各スレッドが処理する量を増やすかスレッドプール式にしては?
0265デフォルトの名無しさん
垢版 |
2018/04/24(火) 00:17:16.38
C++だから関数ポインタ使わないとか頭おかしい

関数ポインタのほうが高速かつシンプルに書けるならそちらを選択すべき
0267デフォルトの名無しさん (ワッチョイ 1a12-/G6U)
垢版 |
2018/04/24(火) 00:26:04.88ID:RoXKv00p0
富豪かどうかはおま環だろ
だから自己申告しないヤツが悪い

なんでこっちがエスパーみたいなことしなきゃいけないんだ
わたくしは教えないがあなたがわたしの環境を忖度しろってか?
ヴァカじゃねえの?
アフォに対してちゃあんと「テメーのスペックはいかほどですか」と尋ねろクズ

富豪かどうかはわからない、それを言わない人間がまず間違い、
それを逆手にとって相手をマウンティングするアフォがいるから話が進まない
0270デフォルトの名無しさん (ワッチョイ 0e8a-HDkP)
垢版 |
2018/04/24(火) 01:40:17.33ID:2n4xWLsG0
>>260
へんてこりんなマウンティングするやつだなあ
ちなみに昨日なんて俺書き込んでないからw
0271デフォルトの名無しさん (ワッチョイ 9a91-Aj1d)
垢版 |
2018/04/24(火) 03:16:15.83ID:CsMI0xmD0
>>248
調べてみたけどさっぱり判りません。
pthread_joinで各スレッドの終了を待って、その後、集計処理をするというのはごく渡り前の処理に見えるのですが、
何が行けないのでしょうか? 
別の方法でスレッドの終了を待たねばならないのでしょうか?
自分勝手デスミア線が、具体的に問題点、改善点を指摘して下さいm(_ _)m。
0272デフォルトの名無しさん (ワッチョイ 0e8a-HDkP)
垢版 |
2018/04/24(火) 03:31:10.06ID:2n4xWLsG0
いいから「単なる加算処理」全部見せろよこの包茎野郎
0273デフォルトの名無しさん (ワッチョイ 9a91-Aj1d)
垢版 |
2018/04/24(火) 03:56:33.85ID:CsMI0xmD0
threadFunctionが、
void* CalcBasicStatics( void* threadArg ) {
    BasicStaticsThreadArg* arg = reinterpret_cast< BasicStaticsThreadArg* >( threadArg );
double intervalOfX = arg->intervalOfX;
double x = arg->dividedRangeOfX.start;
double sumOfY = 0.0;
double sampleCount = 0;
const sc::Sampler& f = arg->f;
while ( x <= arg->dividedRangeOfX.end ){
double y = f( x );
sumOfY += y;
sampleCount++;
x += intervalOfX;
}
arg->sumOfY = sumOfY;
arg->sampleCount = sampleCount;
return nullptr;
}
joinFunctionが、
void CalcBasicStaticsJoin( std::vector< BasicStaticsThreadArg >& args ) {
double sampleCount = 0.0;
double sumOfY = 0.0;
for ( int i = 0; i < args.size(); ++I ) {
sumOfY += args[ i ].sumOfY;
sampleCount += args[ i ].sampleCount;
}
for ( int i = 0; i < args.size(); ++i ) { // 結果を書き込み
BasicStaticsThreadArg& arg = args[ i ];
arg.average = sumOfY / sampleCount;
}
}
です。細々すみません。
0274デフォルトの名無しさん (ワッチョイ 8723-wmjz)
垢版 |
2018/04/24(火) 05:46:22.80ID:vHj8ybNt0
そのコード見ても
並列度もスレッドあたりのサンプル数も
1サンプルあたりのコスト(f)もわからないので
まるで意味がない

2または4並列で、1スレッドあたり1〜10Mサンプルくらい処理するようにすれば
速くなるか少なくともスレッドを使わない場合より遅くならないと思う

同じ速度ということはメモリ帯域が律速なのかもね
0276デフォルトの名無しさん (ワッチョイ 8723-wmjz)
垢版 |
2018/04/24(火) 05:55:18.81ID:vHj8ybNt0
fでメモリのどっかから数値を読んでいるんだと思うけど、
これがなるべく連続したアクセス(局所化を謀る)になるようにループを構成できれば速くなるかもしれない。

この辺りはググれば色々参考になるページがあると思うが
いまググッたらそれらしいページがあったので書いておく
http://myoga.web.fc2.com/prog/cpp/opti02.htm

仕様として外からfが与えられるなら無理な話かもしれない。

もちろん interval が 1 で f(x) が { return v[x]; } のような最適なケースよりは速くならないので
その辺りは無駄な努力をしないよう測っておきましょう。
0278デフォルトの名無しさん (スップ Sd5a-wOeC)
垢版 |
2018/04/24(火) 09:24:50.43ID:jHZYDUEYd
>>250
joinについて勉強しろとか偉そうに言ってたのは何だったの
0279デフォルトの名無しさん (ワッチョイ 0e8a-HDkP)
垢版 |
2018/04/24(火) 18:12:35.67ID:2n4xWLsG0
>>278
こりゃ「多分」joinの問題じゃないなと判断して>>254を書いたんだが
これくらいのコンテキスト読めないとマルチスレッドは無理だよ
0280デフォルトの名無しさん (ワッチョイ 0e8a-HDkP)
垢版 |
2018/04/24(火) 18:15:41.14ID:2n4xWLsG0
fやら具体的なargsの内容やら処理時間測定のやりかたも記述されてないし
んなもの誰も答えられるかよ
0281デフォルトの名無しさん (スップ Sd5a-wOeC)
垢版 |
2018/04/24(火) 18:32:28.83ID:6+u8wIQpd
>>279
違う違う
なんで明らかに間違えてる事を偉そうに述べられるのかと聞いてんだけど
読解力もスキルもないのか
0282デフォルトの名無しさん (ワッチョイ 0e8a-HDkP)
垢版 |
2018/04/24(火) 18:41:27.90ID:2n4xWLsG0
>>281
本当に「明らかに」だと思ってるの?バカですか?
0283デフォルトの名無しさん (ワッチョイ 237f-9jjH)
垢版 |
2018/04/24(火) 18:45:24.94ID:cOEBcXkN0
サンプルレベルのJoinの使い方をみて
「アハハハハ!ジョークのつもりかなんか?そうじゃないならjoinの動きを勉強しろ」
は流石に笑ってしまう
0284デフォルトの名無しさん (ワッチョイ 0e8a-HDkP)
垢版 |
2018/04/24(火) 18:47:53.38ID:2n4xWLsG0
勝手に笑ってればw
0285デフォルトの名無しさん (アウアウウー Sa47-9jjH)
垢版 |
2018/04/24(火) 18:49:15.43ID:Z9G2Fq/Ha
cin で、個数の決まっていない整数たちを読み込みたいのですが、どうすればいいでしょうか?

整数たちの個数 n が分かっていれば、以下のように読み込めばいいですが。。。

vector<int> v;
int i;
for (int i = 0; i < n; ++i) {
cin >> i
v.push_back(i)
}
0288デフォルトの名無しさん (アウアウウー Sa47-9jjH)
垢版 |
2018/04/24(火) 19:15:13.81ID:Z9G2Fq/Ha
>>287

ありがとうございました。

別の質問なのですが、一般的に、vectorの使用頻度というのはどれくらいでしょうか?
配列でやれることもすべて vector を使ってやるという人は多いでしょうか?
それとも、効率などを考えて配列で極力済ませるという人が多いでしょうか?
もちろん、ケースバイケースでしょうけれども、そのあたりの常識がないので、大体
どんな感じなのかが知りたいです。
0289デフォルトの名無しさん (アウアウウー Sa47-9jjH)
垢版 |
2018/04/24(火) 19:17:35.43ID:Z9G2Fq/Ha
自分としては、効率など細かいことは考えずに、vectorを使って問題ない
場面ではvectorを使うという風にしたいのですが。。。

vectorを使っても速度などの点で問題ない場合、一般的なプログラマーなら
どうするのかが知りたいです。
0290デフォルトの名無しさん (アウアウウー Sa47-9jjH)
垢版 |
2018/04/24(火) 19:20:20.45ID:Z9G2Fq/Ha
vector<int> v;
int n;
cin >> n;
int t;
for (int i = 0; i < n; ++i) {
cin >> t;
v.push_back(t);
}

int *p;
int n;
cin >> n;
p = new int[n];
for (int i = 0; i < n; ++i) {
cin >> p[i];
}

どちらにするのが普通なのかの常識がありません。
0298はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b66f-9jjH)
垢版 |
2018/04/24(火) 20:04:19.79ID:VhsA5JFS0
>>289
実用上の問題が無いことがわかっている範囲内であれば、
深く考えずに vector だけで乗り切るのも悪い選択じゃないと思うよ。

ただ、使い分けることで意図を表現しやすい。

たとえば list を使っていれば要素の挿入や削除が頻繁なデータなんだなって思うし、
array が使われていれば要素の個数が固定なんだなって思う。
速度的に影響がない程度の規模であっても、
それが適しているような操作をこれからするのだという意思表明は人間がプログラムを読むときのヒントになる。

そして、そういうヒントは書いている途中にこそ必要なものなので、 >>295 のように後から整理していくスタイルは個人的には好きじゃないな。
0299 ◆QZaw55cn4c (ワッチョイ ba60-Mp6C)
垢版 |
2018/04/24(火) 20:22:55.46ID:B3J+xNmy0
>>298
>それが適しているような操作をこれからするのだ

うーむ、いろいろと考えさせられます
std::vector でなら使えても、std::list では使えない、というのはあるから、最初からそれを考慮しておくのは…よくありますねえ
0300デフォルトの名無しさん (ワッチョイ 9a23-wmjz)
垢版 |
2018/04/24(火) 20:43:20.11ID:Ukt80uX+0
vector は list に比べた場合、

データがメモリ上隣接して並んでいるので
→そういう引数を要する各種 API にそのまま渡せる
→メモリアクセスが局所的にできてキャッシュが効く

予約領域を拡張する場合にのみアロケータが呼ばれるので追加時のアロケータによるオーバーヘッドが低い

とかの良い特性もあるので要素のコピーが軽くて個数が小さいものはvectorにして損することは少ない
0304デフォルトの名無しさん (ワッチョイ 9a34-lUQu)
垢版 |
2018/04/24(火) 23:51:07.95ID:z/eaD8m90
メリットとデメリットを見極められないとコンテナを使いこなすのは難しい
昔から配列を弄り倒している古参にとってはこんなに便利な物はないと思うがね
90年初頭辺りにタイムスリップして実際に構造を真似てフルスクラッチでテンプレートなんぞなかった世界で組んでみればコンテナの挙動は自ずと理解できると思うが時代がわるかったな
今は何も苦労しなくても容易になんでも手に入る世界だからな
修業が足らんよ青二才
0306デフォルトの名無しさん (ワッチョイ e3b3-9jjH)
垢版 |
2018/04/24(火) 23:58:59.30ID:4OXNJpQB0
大規模C++ソフトウェアデザインという本を読んでいます。

冗長インクルードガードが紹介されているのですが、効果あるんですかね。

古めの本なのですが、最近のコンパイラだと意味ないですかね
0310デフォルトの名無しさん (ワッチョイ 9a91-7Gvz)
垢版 |
2018/04/25(水) 02:07:21.83ID:/kuz3CrQ0
243です。
アドバイスを頂き検討したのですが、メモリが散らかっているのが原因と判断しました。
都合により細々とした実装の話は割愛しますが、付き合ってくれた皆さんありがとうございました。
0312デフォルトの名無しさん (ワッチョイ 2350-Incm)
垢版 |
2018/04/25(水) 06:26:59.61ID:8qaCWrbS0
>>305
その特殊な状況の為にlistが存在する

私の場合は特殊なプログラムを書くことが多いので
使いどころは多いのかもしれない

また、普通の組み込みC言語でも簡易な片方向リストとかを使ったりする (C++じゃないのでlistは無い)
0316デフォルトの名無しさん (ワッチョイ 0e76-9jjH)
垢版 |
2018/04/25(水) 11:24:32.26ID:iscLTfMY0
>>313
プリプロセッサは C++ じゃないからね
C++ 以外の言語と共有しているツールなので
それらと歩調を合わせる必要があるし
プリプロセッサだけ独立の規格にするなら
C++ を含め、諸言語の規格も
プリプロセッサのバージョンとどう付き合うのか
策定せにゃならん
0318はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b66f-9jjH)
垢版 |
2018/04/25(水) 15:37:25.53ID:7Yqb38x00
現行では、 #include ディレクティブは「対象ファイルの内容がそこに書かれているかのようにふるまう」という規則なので、
ヘッダファイル内のプラグマ (#pragma once) の解釈が始まるのはインクルードされた後になる。
もちろん対象範囲がコンパイル単位全体に及んでしまっては #pragma once の意味がないが、
現状の仕様に辻褄を合わせるとそうなる。

実装した処理系がもうあるんだから実装に沿うように規定しなおすってことはできなくは無いんだろうが、
#pragma once を仕様に入れるのに #pragma once の項目を追加すれば済むわけではないってことは理解してくれ。

それと、プリプロセッサの仕様は C/C++ の一部なのは確かだが、
挙動を規定しきれていないのじゃないかということは指摘されている。
https://qiita.com/ruiu/items/4d471216b71ab48d8b74#3%E6%9C%8817%E6%97%A5
うやむやでやってきてるところを整理する必要は有ると思う。

>>317
Haskell (GHC) は C プリプロセッサを使うよ。
汎用的に使いたいなら M4 とかの方がいいとは思うけど、
Cプリプロセッサに慣れている人は多いから……。
0319デフォルトの名無しさん (ワッチョイ 0e76-9jjH)
垢版 |
2018/04/25(水) 16:38:46.53ID:iscLTfMY0
また別な話
#includeしようとしているファイルが
過去に#includeしたファイルと同一かどうか
という判定も意外に厄介だね
ハードリンクできるファイルシステムと
そうでないファイルシステムがあったりするし
ハッシュが一致しても衝突かどうかの問題もある
0320はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b66f-9jjH)
垢版 |
2018/04/25(水) 18:09:25.23ID:7Yqb38x00
ハードリンク、シンボリックリンクが無いファイルシステムだったとしても、サーチパスの問題も思いつくな。

たとえばカレントディレクトリと、カレントディレクトリ直下の foo ディレクトリからヘッダファイルを探すようになっているとき、

#include "bar.h"



#include "foo/bar.h"

は同じファイルを指しているが、表現が異なる。
同一のファイルとして除去すべきだろうか?
0322デフォルトの名無しさん (ドコグロ MMcb-cuLp)
垢版 |
2018/04/25(水) 20:33:35.69ID:ntbHaYzVM
>>318
> 実装した処理系がもうあるんだから実装に沿うように規定しなおすってことはできなくは無いんだろうが、
規定すればいいだけだろ?
どこに技術的な問題があるんだ?
政治的な問題だと言うならまだしも
>>319-320みたいな話は処理系定義ですむ話
>>321は少し悩ましいがそもそも途中まで読んでから#pragma onceとか言われても面倒だから書くならファイルの最初に書けとかの制限をつければいい

> 挙動を規定しきれていないのじゃないかということは指摘されている。
いやいや、その子ちゃんと規格読めてないだけでしょ w

> Haskell (GHC) は C プリプロセッサを使うよ。
仕様を流用してるだけでしょ?
何かのコンパイラと共有してるわけじゃないと思うが
0327デフォルトの名無しさん (ワッチョイ 0e76-9jjH)
垢版 |
2018/04/25(水) 22:28:42.99ID:iscLTfMY0
>>322
> 処理系定義ですむ話

それはおかしいでしょ
ハードリンクできる処理系からできない処理系に移植したtarボールの
#includeの挙動が未規定なら結局インクルードガードを自前で書くことになる
0335デフォルトの名無しさん (ワッチョイ 93bd-Mk12)
垢版 |
2018/04/26(木) 00:10:34.39ID:0UXBsrps0
ていうか#pragma onceとか#ifdef〜#endifによるインクル〜ドガ〜ドのシノニム以外の何者でもないと思うが
一方#ifdef〜#endifによるインクル〜ドガ〜ドは
「対象ファイルの内容がそこに書かれているかのようにふるまう」
という規則の下で立派に機能していると思うし、

>>321のように等価な#ifdef〜#endifによるインクル〜ドガ〜ドが存在し得ない場合はエラーにしたら良いと思うし、

ハードリンクできる処理系かどうかに関係なく#ifdef〜#endifによるインクル〜ドガ〜ドは機能していると思うし
(だいたい1バイナリのビルド中にハードリンクの中身が変わるみたいな想定をする方がおかしい=ハードリンクはそうでないファイルと区別がつかないとみなせるハズ

だったら#pragma onceも問題なく規格化が可能なのでは…
少なくとも技術的な問題とかとうていナッシング?
0337デフォルトの名無しさん (ワッチョイ 93bd-Mk12)
垢版 |
2018/04/26(木) 00:41:00.06ID:0UXBsrps0
↑ググってもボンクラが書いたような駄文が見つかるだけなので却下。

1. #pragma onceは#ifdef〜#endifによるインクル〜ドガ〜ドのシノニムである

2. #ifdef〜#endifによるインクル〜ドガ〜ドは世の中で立派に機能を果たしている

にもかかわらず、

3. #pragma onceの規格化の有効な解が存在しない

という驚くべき結論がなぜ導かれるのやろうか…
0338デフォルトの名無しさん (ワッチョイ 1961-luqG)
垢版 |
2018/04/26(木) 06:29:49.76ID:IAeApo/t0
インクルードガードを自前で書くたびに
毎度毎度ワンパターンでタイプ数だけは結構多い不毛な作業は
機械化できないかと考えるのは至極当然
むしろ何の疑問も持たないやつは適性に疑問符がつく

インクルードガード用のフラグマクロの命名則にも不安がつきまとい
無名namespaceのように衝突しない保証があったらなあと思ったりもする
0339デフォルトの名無しさん (ドコグロ MMa3-tYAq)
垢版 |
2018/04/26(木) 07:22:21.59ID:4xU9Va0kM
要するに同じファイルであるかをどうやって判定するかの問題
インクルードガードは利用者(プログラマー)に識別子を決めさせる(押し付けたとも言う)ことで実現してる
なので押し付けられたプログラマーには
> インクルードガード用のフラグマクロの命名則にも不安がつきまとい
みたいなことが発生する
#pragma onceはこの判定を処理系側でやるんだが例えばファイルの絶対パスで判断するとかファイルをインクルードする前にmd5とかのハッシュを求めて判断するとかすればいいだけ
ハードリンクとかで違う名前つけて#pragma onceがうまく動かないとか言うアホとかは無視すればいいし、ハッシュの衝突が心配と言うなら衝突した時に比較するようにすればいい
どういう仕様がいいのかで揉めるのはあるけど技術的な問題とか言ってる奴はちょっと知能が足りなさすぎ
0340デフォルトの名無しさん (ワッチョイ 4193-JpCb)
垢版 |
2018/04/26(木) 07:42:18.98ID:n/ljx3l20
>>338 #ifndef 形式のインクルードガードを自前で書くとタイプ数が多いし
識別名を打ち間違える危険もあるから .h のファイルを新規作成したときに
自動的に入力されるようにエディタのマクロにしたよ。
まぁ、識別名をファイル名から作ってるから、ファイル名の変更でアレだけど。

昔(フロッピーでやってた時代?)は #ifndef 形式でガードすると
どのみちヘッダファイルをまるごと読み込まなきゃならないから、
#pragma once の方がコンパイル時間において優れてる、などと言ったけど、
ハッシュを計算して同一か検証するとか手間が増えるなら
時間の面での優位性はなくなったのかな。
0341はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5b6f-luqG)
垢版 |
2018/04/26(木) 09:45:48.32ID:P0bCzIha0
「技術的な」というときの技術は「プログラミング技術」の意味じゃないこともあるんだよ。
前置きが無い限り広すぎてあんまり意味ない。
実装がいくつもあるのに、仕様策定にあたっての言葉で出てくる「技術的な」なんだから文脈でわかれよ。
仕様に落とし込む難しさが元々の論点。

ハードリンクの話題は「同一のファイルとは何か」を定義する難しさの一例で、実装のことなんか言ってない。

このスレで既に上がっている選択肢だけでも

 ・ 内容が同じ
 ・ 絶対パスが同じ
 ・ #include ディレクティブ中の表現が同じ
 ・ inode が同じ (ハードリンクは同一とみなす)

があり、内容の一致を選択する場合以外は言語の外の世界の環境に関する記述が必要になる。
世の中にある色んな環境のことを考慮して文面にする難しさってのはわかるだろ?

そんなわけで、個人的には内容の一致だけで判定するのが (仕様として定義するにあたって) 一番簡単だと思う。
ODR に関するルールの中にも同じトークン列を要求するものがあるし。

それに加えて >>318 で取り上げた展開手順の規則をなんとかする必要はあるが、 >>321 に解を与えるような上手い簡単な規則は思いつかないな。
既に多く書かれてしまっているコードの現状との互換性を考えると >>322 のいうような、
#pragma once を書ける場所を制限するような規則は選択できないと思う。
結局は複雑なものにならざるを得ない。

そんなのほっといてモジュールの導入に邁進しようぜっていうのは妥当な方針だろ。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況