C++相談室 part131 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2017/07/29(土) 11:28:28.97ID:o30VDF4g0
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512

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

前スレ
C++相談室 part130
http://mevius.2ch.net/test/read.cgi/tech/1490917669/

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

■長いソースを貼るときはここへ。■
 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
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2017/09/20(水) 06:46:32.53ID:k3KNfXHnM
>>737
それが間違ってるって話
>>741が言うようにローカルアドレスを指定すれば同じPCで同じポートを使用するサーバーを複数立てられる
2017/09/20(水) 10:56:07.53ID:uOAr6bd90
自己訂正
>まさかその生成されたソケットがサーバーと同じポート番号を持つとか思ってないよな?
あはは、これは俺の勘違いだったわ
acceptで返されるソケットはlistenポートと同じポート番号を持っている
745デフォルトの名無しさん (ワッチョイ 0665-hoCt)
垢版 |
2017/09/21(木) 05:09:49.50ID:t8iqXrAz0
質問です。

{ 10/*%*/ } = { a,b,c };

というのは、
a = 10%
b = 10%
c = 10%
なのでしょうか?それとも、
a+b+c = 10%
なのでしょうか?
746デフォルトの名無しさん (ワッチョイ de23-KbB0)
垢版 |
2017/09/21(木) 05:48:27.92ID:eSaSp7RC0
C++を習得するのに莫大な時間を費やしました。

C++のプロフェッショナルなプログラマーになりたかった。

なのに、ハード系の知識が無いと言う理由で、もらう仕事はVB.NET、C#.NET系ばかりでした。
747デフォルトの名無しさん (ワッチョイ de23-KbB0)
垢版 |
2017/09/21(木) 05:51:26.56ID:eSaSp7RC0
質問を書くのを忘れやんした。

C++の仕事ってハード系、通信系、制御系以外、通常業務のシステム開発はないんでしょうか?
2017/09/21(木) 06:00:29.19ID:Bo0/1phe0
ポート重複で同じアドレスでBananaサーバーみたいなラックマウントサーバーの仕組みってあれは一つのサーバーがlistenで待って接続してきたクライアントの処理を複数の子サーバーに割り振っているだけなのか?
2017/09/21(木) 08:18:42.29ID:E1HbcZFyr
struct unko { unko()=delete; };
int main() { unko u{}; }

何故コンパイルが通るのかを理解するのに半日かかった
やはりこの言語はクソ
2017/09/21(木) 08:46:59.52ID:iktVOuYO0
>>746
他人から降って湧いてくることしか期待してないからそうなる
自分がやりたいことは自分で始めろ
2017/09/21(木) 10:13:00.29ID:JjsSVLys0
>>747
C++はC#とかでできないことがあるときに仕方なく使うイメージがある
2017/09/21(木) 11:36:34.81ID:p6kNBh4ir
>>749
あれ
何で動くんだ?
plain old dataあたりの話が噛んでる?
2017/09/21(木) 12:35:00.95ID:iktVOuYO0
C#の方が楽なところが特に無いのでC#という選択肢が無い
2017/09/21(木) 13:21:38.51ID:TbHBi0+x0
>>752
PODがかかわってる部分はあるけど基本として理解しておくべきことは
=default,=delete指定はコンストラクタの宣言でも定義でもない
ということ

つまり>>749の文脈では
struct unko { unko()=delete; };
int main() { unko u{}; }

struct unko {};
int main() { unko u{}; }
と等価でありuはaggregate初期化されコンストラクタは呼ばれないからエラーにならない
(unko();みたいにはっきりとデフォルトコンストラクタが呼ばれる状況ならエラーになる)
2017/09/21(木) 16:15:38.61ID:na02B6ss0
>>750
お、おう!
2017/09/21(木) 17:36:23.55ID:E1HbcZFyr
>>752
規格によると unko u{}; は
8.5/p17『If the initializer is a (non-parenthesized) braced-init-list, the object or reference is list-initialized』によりリスト初期化される
リスト初期化は8.5.4/p3『If T is an aggregate, aggregate initialization is performed』
に該当するのでコンストラクターが呼ばれずにaggregate初期化される。

なおaggregateの定義は8.5.1/p1により『array or a class (Clause 9) with no user-provided constructors (12.1), no (略)』
ここで8.4.1/p1により「=delete」は関数本体だが、
8.4.2/p5によりuser providedではないと見なされている(たぶん)
2017/09/21(木) 22:11:37.04ID:VzX3yrPwM
>>748
パケットレベルで振り分けたり、プロキシとして動作したり色々
ロードバランサ 仕組み
とかでググるがよろし
あとそこまで行くと完全にスレチなので

ネットワーク
http://mevius.2ch.net/hack/

とかに行っとくれ
2017/09/21(木) 23:20:34.43ID:Bo0/1phe0
ほほう
2017/09/23(土) 11:36:40.13ID:2CJ5RW/30
>>747
20年前は普通にあった、ていうかそれしか方法がなかったが
今はもっと楽な方法があるのでほぼ無くなった

僅かな例外はパフォーマンスを求めるようなプログラムを作る場合だが
それでもライブラリなどの表から見えない部分の作成に限られる
2017/09/23(土) 21:53:53.16ID:DdQqqOWmH
各添字が 1 から X まで動く多次元配列を一次元で
A[i + X*j + X*X*k]
のように表しているのですが、この多次元配列の各添字を入れ替える操作を頻繁に行うので、関数にしたいです。
どのようにするのが良いでしょうか。

たとえば
f(A, B, 2, 3, 1);
のように引数をとって B という配列に
B[j + X*k + X*X*i] = A[i + X*j + X*X*k]
と要素を入れたいです。

「2, 3, 1」を関数の中で解釈する方法も分からなくて困っています。
2017/09/23(土) 22:14:21.88ID:dWsmcDp10
>>760
その例だと A[X][X][X] の3次元相当だけど3次元限定でいいの?
2017/09/23(土) 22:34:01.05ID:qTNnvPi+0
https://ideone.com/x9PCnt
こんなんでええやろ
2017/09/23(土) 22:36:10.87ID:dWsmcDp10
>>760
こういう解釈でいいかな?

template <typename T, std::size_t X>
void fillA2B(T (&A)[X*X*X], T (&B)[X*X*X], int ax1, int ax2, int ax3)
{
int i, j, k;
int& ii = (ax1==1)? i: ( (ax1==2)? j: k );
int& jj = (ax2==1)? i: ( (ax2==2)? j: k );
int& kk = (ax3==1)? i: ( (ax3==2)? j: k );
for ( i = 0 ; i < X ; ++i )
for ( j = 0 ; j < X ; ++j )
for ( k = 0 ; k < X ; ++k )
B[ii + X * jj + X * X * kk] = A[i + X * j + X * X * k];
}

int main()
{
const int N = 2;
int A[N*N*N], B[N*N*N];
int n{0};
for ( int a = 0 ; a < N*N*N; ++a )
A[a] = n++;
fillA2B<int, N>(A, B, 1, 2, 3);
fillA2B<int, N>(A, B, 2, 3, 1);
fillA2B<int, N>(A, B, 3, 1, 2);
return 0;
}
2017/09/23(土) 22:38:24.75ID:cFmXNXGU0
左辺が j, k ,i 右辺が i, j, k のようだが
2017/09/23(土) 22:45:31.08ID:dWsmcDp10
あ、一気に全要素にFillしなくてもいいのかな?
2017/09/24(日) 00:03:03.61ID:7FyCscw80
……素直に3次元の配列にすりゃあいいんじゃねえのかなコレ
どーーーしても1次元にしなきゃいけない重大な理由が背後に控えてんのかな?
2017/09/24(日) 00:08:42.25ID:xnpjieyid
普通にメモリ確保したら1次元だからな
2017/09/24(日) 00:21:25.13ID:J5lzydll0
B[ii][jj][kk] = A[i][j][k];
でも通るな
2017/09/24(日) 00:25:12.68ID:QX+6yKIgH
>>761
もちろん任意の次元を一度に扱えたら最高です。
ゆくゆくは各添字の次元を変えることも考えています。

>>762>>765
すみません。
全要素を並び替えたいです。

>>766
カラムメジャー、ロウメジャーを任意にしたいという背景があります。
また、各添字の次元が本当は任意であるということもあります。

>>763
ありがとうございます。
確かにこれで>>760はできそうです。
パーミュテーションの実装の仕方が分かりました。
原理的にはこれで任意の添字の数、次元に対応できる (それぞれ関数を作る必要はある) と思うのですが、もっとアカデミックな方法ともあるのでしょうか?
2017/09/24(日) 02:35:34.07ID:0uAENq5F0
>>769
アカデミックは知らんが一般化するなら
B[ i*bi[0] + j*bi[1] + k*bi[2] + ... ]
と各次元ごとの係数を変数にして設定だな
>>760のたとえばでは bi[0] = X*X, bi[1] = 1, bi[2] = X

あとはインターフェイスにあわせてヘルパ処理を用意すればいい
f(... int x, int y, int z)
int bi[3];
bi[x - 1] = 1;
bi[y - 1] = X;
bi[z - 1] = X*X;
2017/09/24(日) 17:29:12.46ID:vw1eQBGxr
>>770
ありがとうございます。
あとは任意個数の引数を取れるようにすれば添字がいくつあっても、各添字がどのように走っても一つの関数で対応できますね。
勉強になりました。
2017/09/25(月) 00:05:50.55ID:KE0eJu6Z0
C++とほとんど関係ないな
773デフォルトの名無しさん (ワッチョイ de1c-iatd)
垢版 |
2017/09/25(月) 10:20:39.11ID:c/fcx1bx0
任意個数の引数って、まさか省略記号と可変個数実引数では・・・
と思ったらモロじゃねえか おいおい
このスレ的にはinitializer_listやtemplate parameter packだろ
2017/09/25(月) 11:38:31.09ID:VZWzPiEFd
>>773
template parameter pack って variadic template と同じもの?
後者の呼び方には馴染んでるんだけど。
2017/09/25(月) 12:51:53.80ID:ML1gBCAMM
>>774
同じ
2017/09/25(月) 16:12:14.99ID:b+XdOI/H0
>>773
ほっといたっていずれ覚えるだろうに何故押し付けるのか
2017/09/25(月) 17:17:22.88ID:RnBeI/QIM
>>776
より良い代替案があるんだったらそっちに誘導すべきだろう。
実際使うべきじゃないし。
2017/09/25(月) 18:34:40.87ID:iFpSSPyJr
>>774
違う
779デフォルトの名無しさん (ワッチョイ de1c-iatd)
垢版 |
2017/09/26(火) 10:35:57.85ID:DAuKDJeY0
>>776
このスレ的にはって書いてあるのが読めてないのか
自分が苦手なものに触れられたくないのか
どっちだ?
2017/09/26(火) 11:02:34.83ID:XbrOuhiT0
>>779
最近お前みたいなニワカが増えてうんざりするわ
というかCの可変長引数がどこに出てきた?
2017/09/26(火) 11:38:28.30ID:XSwUFkBD0
つかぬことを伺いますが、
あるクラス内で定義した構造体を同クラス内でstatic constメンバとして宣言し、
外部で定義しようとしたところ、「〜との互換性がありません」と出て上手く行きません
どうすればよいのでしょうか

〜ヘッダ内
class Hage{
public:
struct A{
int a;
int b;
};

static const struct A M;

}

〜ソース内
#include "ヘッダ"
const struct A Hage::M; //不正
2017/09/26(火) 11:39:54.54ID:XSwUFkBD0
あ、行頭の半角スペース消されるの忘れてた
2017/09/26(火) 11:48:05.08ID:XbrOuhiT0
const struct Hage::A Hage::M;
2017/09/26(火) 11:48:55.33ID:r3ztyMSNd
>>781
少なくとも Hoge::A としなけりゃダメなんじゃないか

>>771を読んでもCの可変長引数とは決めつけられなかった
2017/09/26(火) 11:51:53.92ID:XSwUFkBD0
うわあ何でこんな初歩的なことに躓いていたんだアホらしい
>>783-784サンクス
786デフォルトの名無しさん (ワッチョイ d311-Dc1X)
垢版 |
2017/09/26(火) 15:18:58.40ID:SDiSqFpw0
###HUM###
000-K,AZ,0,1,
001-KI,L,I.T,DEF,11.2,TE,F,0.12235,
002-EM,OBLA,7##END
787デフォルトの名無しさん (ワッチョイ de1c-iatd)
垢版 |
2017/09/26(火) 15:24:00.47ID:DAuKDJeY0
>>780
うわーおまえ、それ人に聞かなきゃ判んねえの?

省略記号は右端という初歩の初歩でミスりながら
ドヤってる笑い地獄が2日前あったんだが
突っ込めなきゃせっかくボケた芸人も泣いてるだろうな
2017/09/26(火) 16:32:49.03ID:XbrOuhiT0
>>787
まずはsageることから覚えような
2017/09/26(火) 16:36:37.77ID:r3ztyMSNd
>>773の「モロじゃねえか」がどっから出てきてるのか謎だ
2017/09/26(火) 17:08:16.18ID:XbrOuhiT0
多分Cの可変長引数なら右端以外にも書けると思ってんじゃないかな
2017/09/26(火) 18:55:18.16ID:DXd+nok20
こんなイメージかな?
#define X (100)

#define f(a,b,c,d,e) ((b)[(c)+X*(d)+X*X*(e)] = (a)[(e)+X*(c)+X*X*(d)])
2017/09/26(火) 19:31:39.64ID:T9NefDHyr
>const struct A Hage::M; //不正

初歩的でなく相当に高度な気がしてならない
規格の3.4.1/p7,p8,p14あたりを頭に入れていないといけない
「class NS::C;」のように何でも「::」を付ければ良いと言うわけでもないので
2017/09/26(火) 22:59:17.35ID:pvKSJMRt0
そうでもない
2017/09/26(火) 23:10:02.38ID:28pSalnA0
だってグローバルスコープにも struct A; が存在したらどうなるか?
って考えればすぐわかりそうなモノじゃんね
2017/09/26(火) 23:33:07.57ID:QYZ1C1Pk0
グローバルが優先される所と、グローバルよりクラスや名前空間が優先される所が入り乱れたこの言語で
どちらが優先なのかを正確に覚えてるのはかなりの変人である可能性が高い
https://ideone.com/RZTBk7
2017/09/26(火) 23:48:01.42ID:piJXswiP0
グローバルが優先するところなんてあったか?
2017/09/26(火) 23:48:58.27ID:28pSalnA0
>>795
その例ではいったんA::の中に入っているから B はA::B になるけど
>>781 のはそうじゃないからな。
798デフォルトの名無しさん (ワッチョイ de1c-iatd)
垢版 |
2017/09/27(水) 00:14:02.46ID:LyDwKMB00
>>788
おーいバカ、省略記号の位置の件はわかったか?
まさか789なみの重度池沼じゃねえよな
2017/09/27(水) 00:41:37.58ID:lz0JexH90
>>771>>770を参考にして新たに考えようとしてるじゃないか。
それを>>770のやり方でまんま行こうとしている、と解釈するのは悪意があるぞ。
800デフォルトの名無しさん (ワッチョイ de1c-iatd)
垢版 |
2017/09/27(水) 00:57:18.03ID:LyDwKMB00
だからって770の大ボケを正当化する法はあんめえ
2017/09/27(水) 07:53:47.82ID:Ep3hxvTm0
あんめえ
2017/09/27(水) 09:12:11.59ID:nsBNhogE0
>>800
お前まだ分からんのか・・・
>>770のどこが大ボケなんだよ
添え字演算子の中で二項演算子の後に省略記号書いて再帰的に計算させたり
パラメータパック(またはそれを含む式)も無しに引数の左端にいきなり省略記号書いたり
なんてのはCでもC++でも出来ないの
お前みたいにCの可変長引数もvariadic templateも分かってるつもりなら
>>770を見た瞬間にこれは文面上の省略であって動くコードではないと一瞬でわかるはずなんだよ

質問でもないのにageまくるわ自分も初心者のくせして同じ初心者(あるいはそれ以上)を聞きかじりの知識でバカにしようとするわ
憂さ晴らしにしか利用しないのなら出ていけ
803デフォルトの名無しさん (ワッチョイ de1c-iatd)
垢版 |
2017/09/27(水) 09:30:35.39ID:LyDwKMB00
文面上の省略だっておw
大ボケに苦しい言い訳を上塗りして
アフォから超アフォに進化したなあ
2017/09/27(水) 09:41:27.37ID:nsBNhogE0
>>770じゃないよw
805デフォルトの名無しさん (ワッチョイ de1c-iatd)
垢版 |
2017/09/27(水) 10:03:04.41ID:LyDwKMB00
どう見ても770だな
必死さの理由が他にない
2017/09/27(水) 10:19:41.03ID:Ls/Jbx6+0
ワッチョイも知らないアホじゃん
807デフォルトの名無しさん (ワッチョイ de1c-iatd)
垢版 |
2017/09/27(水) 11:12:43.27ID:LyDwKMB00
驚いた、ム板にIP信者がいるとはね
嘆かわしい限りだ
2017/09/27(水) 11:41:32.93ID:/eBNIii1d
>>800
だったら>>771をターゲットにすればよかったんだよ
お前は>>770をも貶し続けていると見なされていたんだよ
2017/09/27(水) 11:42:15.16ID:/eBNIii1d
>>808
間違えた、逆だ
810デフォルトの名無しさん (ワッチョイ de1c-iatd)
垢版 |
2017/09/27(水) 14:47:33.57ID:LyDwKMB00
大ボケ+言い訳+IP信者+錯乱

この安定したアフォぶりは、どう見ても同一人物だなw
811デフォルトの名無しさん (ワッチョイ 1511-Txnz)
垢版 |
2017/09/29(金) 01:30:30.30ID:ppl3WHHK0
%%%3%%%
000-DOK<NAZE-0.8112162>
001-3800%\73NMB/1,81,2,NB"IKKI"%
002-91.81%ML7"8.122231746668193,43@ML.4@"%^23.1444
003-1.33321444718%"YLD""SO"%{71.%{62.1339816{331.422231765%<<<NL6
004-LOOP%Go To"000"%

VCL
2017/09/29(金) 22:15:16.68ID:7WUGaaf40
javaやc#しかやったことないような人間がc++でもメモリ管理をきちんと身につけるには何から始めるのが手っ取り早いでしょう?
2017/09/29(金) 23:55:16.07ID:7WUGaaf40
そもそもみんなc++で何してるの?🤔
2017/09/30(土) 00:49:06.72ID:Yf3yOiqk0
人工知能ゥ・・・
2017/09/30(土) 00:56:27.58ID:H54Xn+Px0
>>812
C++ ではなるべくスマートポインタを使って自動化すべきなんだけど、
その内側にあるメモリの気持ちを実感として持つには C の範囲で色々やってみるのもいいかな。
2017/09/30(土) 01:18:37.51ID:bL0j7tMv0
>>812-813
JavaやC#が選択肢になる状況でC++を選択する理由はない。
今C++を何に使うか決まってないのなら、JavaやC#を極める方向に努力した方がいい。
2017/09/30(土) 01:39:01.97ID:zjlhf9G/0
VisualStudioでMFCのSDIテンプレートを作ると、ドキュメントクラス、ビュークラス、アプリケーションクラス、メインフレームクラスができますが、
これらのポインタを初期化時にグローバル化しておいて、以後あらゆるクラスから気軽にアクセスできるようにしとくのは良くないんでしょうか?
グローバル変数はあまり使うべきではないという考えは置いておくとして、動作上問題は起こるのでしょうか?
2017/09/30(土) 09:54:39.91ID:1M7A4t/A0
まあたまには口ですることもあるかな…
2017/09/30(土) 16:24:19.18ID:EIEZdyCfd
問題が起こらないように作れば起こらない
としか言えない
2017/10/01(日) 00:09:52.37ID:A+1idbvt0
MFCのtheAppには100万回ぶち切れてきたけど動作上は特に問題は無い
821デフォルトの名無しさん (ワッチョイ 4b1c-HyX/)
垢版 |
2017/10/01(日) 04:08:21.65ID:EFR2vscz0
あーこの人、こうやっちゃったんだ(ニヤニヤ
しながら使うもの
ARM C++ベースなんで同情するところもあるけどね
2017/10/01(日) 11:18:29.65ID:coFT7XLp0
グローバル変数だからといって頭ごなしにぶち切れるのもいかがなものか…
CPU視点でやるべきことに対して処理順序にあいまいさが生じないなら実行上問題無いし、
プログラマーの視点で管理できる個数なら実用上も問題無い
同一クラスの複数インスタンスが欲しければグローバルな配列にしたらやり過ごせる

ていうか仮にtheAppを根とする木構造で全てのデータを管理することを思い立ったとして、
その木の根付近をぶち切って得た2〜3の大枝をグローバル変数を根とするそれぞれ別の木にする、ぐらいの
挿し木設計は設計上のショートカットとして許されるべきや
というのは、プログラムのあらゆる箇所で
 theApp()->getMemberA()->getMemberAA()->getMemberAAA()->...->getMemberZZ()->getValue()
と書かねばならなかったものが、
 g_dataAA->...->getMemberZZ()->getValue()
ぐらいで済む
2017/10/01(日) 12:31:41.44ID:A+1idbvt0
平気でグローバル変数を使う奴はtheAppの混じったコードを使いまわし続けて大量にデータを持たせるようになる
そして結合しまくりのクラスを他のソフトにコピペしていつのまにか神theAppができある
マルチスレッドで読み書きしてるもんだから予想外のバグが起こる
上司はそれでそれが当たり前だと思ってるから同じようにしろと俺に命令する
俺切れる
2017/10/01(日) 12:47:25.61ID:coFT7XLp0
>マルチスレッドで読み書きしてるもんだから予想外のバグが起こる
これはグローバル変数でなくとも起きる設計なら起きるから別件
ていうか
>CPU視点でやるべきことに対して処理順序にあいまいさが生じ(>>822)
ているケースにあたる

非同期呼び出しの同期化は呼び出される側のクラスで解決すべき、というだけ
メソッド内で完結できれば最も安全
パホーマンスや処理の粒度の関係でそれが適さない場合は
トランザクション処理をちゃんと設計汁、
2017/10/01(日) 12:50:48.09ID:+enXMbbO0
>>823
アプリケーションの中で寿命の長いデータはどこにどうやって置いてるの?
2017/10/01(日) 14:12:37.21ID:A+1idbvt0
>>824
ちょっと足りなかったわ
マルチスレッドでかつ複数のクラスを跨って別々の場所で読み書きされているからいつどこで変更されるかわからないことが多々ある
そうなるとあちらを立てればこちらが立たずといった感じになり、きれいに書く気力が失われてさらに汚さが加速する

>>825
必要なデータだけを引数で与えるべき
2017/10/01(日) 14:15:44.38ID:P+J8m3XL0
グローバル変数で同期とるんじゃないぞ。そんなもので同期なんて取れないからな。
ちゃんとOSが提供する同期オブジェクト使えよ。
2017/10/01(日) 14:17:42.21ID:LFbo+6zld
どんな環境でもOSがあってしっかりした同期の仕組みが有るとか思ってるお花畑がいると聞いて
2017/10/01(日) 14:25:15.04ID:P+J8m3XL0
いやはや無知で申し訳ない。
マルチスレッド機能があって同期の仕組みが提供されない処理系があるならばご教授して頂きたい。
2017/10/01(日) 14:59:48.84ID:8m985+fI0
文脈上Windowsでの話なのははっきりしてるのに「どんな環境でも」とか
2017/10/01(日) 15:20:08.45ID:+enXMbbO0
>>826
>必要なデータだけを引数で与えるべき

引数を渡す側がそのデータをどこにどうやって保持すればいいのか、という問題が残るだけでは?
2017/10/01(日) 15:35:52.14ID:7TdPvZgo0
>>831
> 引数を渡す側がそのデータをどこにどうやって保持すればいいのか、という問題が残るだけでは?
再帰的にたどって行けばいいだけかと
プログラムの寿命とほぼ同じ寿命が必要ならmain( )で定義することになるだろうし
2017/10/01(日) 15:38:17.18ID:P+J8m3XL0
どうしてもグローバル的なものがほしいなら、グローバルにしてしまえよ。
アクセス用の関数だけしっかり同期処理書けばいい。
2017/10/01(日) 15:41:47.38ID:coFT7XLp0
んまーマルチスレッド機能有りのOSであり
 (1) OSがプリエンプトしてくるのを止めるAPIが無い
 (2) ユーザープログラム独自に割り込み禁止命令を実行できない(特権命令違反でトラップされる
としたらユーザー側ではフラグのread modify writeのアトミック性を保証する術がまるきり無くなる
2017/10/01(日) 15:43:55.69ID:coFT7XLp0
いやすまん下記も追加
 (3) interlock系の命令が使えない(特権命令違反か何かでトラップされる
(3)は使えるかな普通…
>>829のは杞憂かもしれんな…
2017/10/01(日) 15:51:28.11ID:coFT7XLp0
しかしまあ同期処理はOSが提供すべき(理念としてだけでなく、その方が効率よく実現できるから
というのは同意
マルチスレッド機能があるOSなら必ずプリエンプトされないコード範囲を持つので、そこでなら
interlock系の命令を持たないZ-80みたいなCPUでも何も問題なくアトミックなread-modify-writeができる、
2017/10/01(日) 15:52:05.08ID:7TdPvZgo0
>>834-835
Compare-And-Swapとかの命令が特権命令になってるプロセッサなんてあるんだっけ?
2017/10/01(日) 15:59:29.84ID:coFT7XLp0
>>837
Interlock系命令の意味で言った
正しい言葉使いかは知らん…!
2017/10/01(日) 16:05:24.82ID:a+6SxdIf0
atomicなread及びwriteが使えるならmutexを構成できるし、それを利用すればread modify writeも可能だよ。
2017/10/01(日) 17:15:48.85ID:zBOS+jx9M
ミューテックスが何だって?
くだらねえ話しやがって・・
2017/10/01(日) 17:18:14.77ID:A+1idbvt0
>>831
どんどん上にたどっていく
そのデータを管理しなければいけないクラスあるいはmain関数が保持すればいい
externした変数はそのクラスが所有権を持っていることと同等なので、パフォーマンス上の都合が無ければ極力共有は避けるべき
あとコードを使いまわすときにも障害になる
ファイルにまとめて他でincludeしてもそのまま使えない
2017/10/01(日) 17:46:49.19ID:+enXMbbO0
>>841
>そのデータを管理しなければいけないクラスあるいはmain関数が保持すればいい

クラスが持つっていうのはそのクラスのスタティックメンバにしろという意味?
それでは結局グローバル変数とか無名namespace内変数とあまり変わらないような気がする。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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