No.3ベストアンサー
- 回答日時:
「C++」では何の問題もありません.
「C」だと, ふる~い時代の遺跡級のコンパイラが文句を言うかもしれません. ま, その手の遺跡級のコンパイラだと
・void がない (void * は char * で代用する)
・プロトタイプが存在しない
・const や volatile がない
・ひょっとすると単項の + もない
など, 今の視点からするといいたいことは山ほどあります (さすがに a -= b; ではなく a =- b; とするコンパイラを使うことはないだろう).
そのような時代には構造体のコピーを memcpy でやっていましたが, C++ では逆に危険です.
No.7
- 回答日時:
基本的には問題ありません。
しかし、構造体のコピーには時間が掛かります。
yontosuさんの言う例のような、たかだかchar namae[10]程度の小さな配列であれば問題ありませんが、例えばchar namae[100000]のような巨大な配列であればそれなりに時間が掛かります。
「そんなデカい配列を作る訳が無い。」
そう思うかもしれません。
でも例えばこう言った例はどうですか?
typedef struct seito {
char namae[10];
char gakkou[50];
char juusyo[100];
int ten;
}Seito;
typedef struct kurasu {
Seito seito[50];
}Kurasu;
typedef struct gakunen {
Kurasu kurasu[10];
}Gakunen;
こんなような構造体を作ったとしたら、この構造体の「Gakunen」中にはchar配列が80000個分あります。
これを丸々コピーしようとしたら・・・それなりに時間が掛かりますよね・・・?
・・・と言っても、最近のコンピュータはかなり高速なので、実はchar配列80000個程度ではびくともしません。
ただし。for文とかで、例えば生徒の数分、80000回繰り返すとしたら・・・80000×80000=6400000000と言うゼロが何個あるのかと言う相当な数値です。
更にfor文の入れ子でこれを1000回ループしたら・・・ここまで巨大な数値になってくると流石に最近のコンピュータでも結構な時間が掛かります。
学校で習うような小さなプログラムであれば大した問題にはなりませんが、
実際の業務で使うようなプログラムではこういう巨大な構造体は平気でありますし、
それを(入れ子の入れ子の入れ子の・・・で)1000000回ループなんて言う事もザラです。
将来IT系の仕事に就こうと思っているなら、今のうちに配列のコピーは使わず、
ポインタ等を使う手法に慣れておいた方がいいです。
No.6
- 回答日時:
C++においてstructをどのように使うべきかについて、以下の記述がありますので、参考にして下さい。
「
...The only difference is that with the 'struct' keyword, all members are public by default.
Nevertheless, I would recommend using 'class' and 'struct' in a way that helps clarify the semantics.
That is, 'class' should be used when we define objects that have data members and member functions with different access levels, while 'struct' should be used if we only need a data structure ( a composition of values ) with public access to all data.
...
Unfortunately, the semantic difference between 'class' and 'struct' is not made in much of the literature.
」
Nicolai M. Josuttis「Object-Oriented Programming in C++」(p.132)
No.5
- 回答日時:
#3 の方も指摘されていますが、基本的に質問にあるようなコピーや
a = b みたいな代入ならば問題ありません。
memcpy()のような直接メモリをコピーするような場合におかしくなります。
ただ、mem*()を利用する場合でも、純粋な構造体(Cでも利用できる構造体)ならば、問題はないようです。
この辺、個人的にはC++の仕様バグ(あるいは欠陥)なんじゃないかとも考えているのですが
C++の場合、構造体もクラスとして扱われるので
メンバー関数の追加や継承とかもできてしまうのです。
その関係かしら、構造としてメンバーにも見えない部分があって
たとえば、memset(&a, 0 sizeof(a) )とかしたひにはきっとcoreはきます。
memcpy()ならば問題ないかもしれませんけど、クラスみたいな使い方をしている場合はやめておいた方が吉かもしれません。
No.4
- 回答日時:
> C++言語で、構造体のコピーは可能(しても良い)のでしょうか?
普通は可能です。
ただし、できない場合もあります。
具体的には、次のようなケースです。
struct A
{
int a;
private:
A(const A&);
A& operator=(const A&);
};
明示的にコピーが禁止されていますので、コピーコンストラクタやコピー代入演算子を呼び出そうとすると、コンパイルエラーになります。
このような型のメンバを持つ構造体も同様です。
また、std::auto_ptrのような破壊的セマンティクスを持つメンバを持つ場合も、コピー代入演算子は使えても、コピーにはなりません。
No.2
- 回答日時:
昨今ではまず問題ないです。
あえて上げれば、C言語の標準仕様が策定される以前、
そういったコピーができなかった時代があるので、
ふるーい遺物の場合くらいでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- 哲学 非構造主義 1 2023/04/06 16:02
- 日本語 日本語のアクセント 1 2022/05/12 13:26
- 英語 提示した結果構文が非文となる理由について 1 2022/07/25 12:22
- 哲学 日本語は 言語類型として あたかも始原のごとくである 3 2022/05/29 04:41
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
構造体のデータを丸ごとコピーしたい
C言語・C++・C#
-
C++ 構造体の一括初期化 {0}
C言語・C++・C#
-
異なる構造体のデータのコピー
C言語・C++・C#
-
-
4
char*を初期化したいのですが
C言語・C++・C#
-
5
構造体のメンバをfor文で回したい
C言語・C++・C#
-
6
C言語での引数の省略方法
C言語・C++・C#
-
7
戻り値で構造体を返すことは可能でしょうか?
C言語・C++・C#
-
8
unsigned long long 型のフォーマット指定子
C言語・C++・C#
-
9
C言語でのconstを返す関数
C言語・C++・C#
-
10
ファイル書込みで一行もしくは部分的に上書きする
PHP
-
11
#defineの定数を文字列として読み込む
C言語・C++・C#
-
12
charからLPTSTRへの変換方法
C言語・C++・C#
-
13
C++にてtemplateで受け取った任意の型の変数が何型であるかを判定したい
C言語・C++・C#
-
14
C++でCの構造体をnewするとまずいのでしょうか?
C言語・C++・C#
-
15
C++で構造体のコピーはできても == や != で比較はできないので
C言語・C++・C#
-
16
C言語で構造体のメンバを簡単に出力する方法ありますか?
C言語・C++・C#
-
17
C言語で、メモリを解放しないで終わるプログラム
C言語・C++・C#
-
18
int型の内容をbyteの配列にコピー
Java
-
19
構造体の要素すべてに対する四則演算の方法を教えてください.
C言語・C++・C#
-
20
C++のfor文について
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルのマクロについて教え...
-
エクセルVBA 実行時エラー'...
-
DataTableに入っているデータを...
-
ROBOCOPYをスペース付きのフォ...
-
Access VBAから使用したExcelプ...
-
プログラムについて。
-
arduino unoからデータを読み出...
-
彼女の過去の恋愛に嫉妬してし...
-
sharedObjectでのファイルについて
-
「このファイルを開く前に常に...
-
VBScriptでExcelファイルをDLす...
-
アイコンが化けてUNIX実行ファ...
-
OneDrive必要なものでしょうか
-
.imgファイルから、インストー...
-
自動で.xlsを閉じて指定フォル...
-
ファイルが勝手に作製されてし...
-
dmgファイル
-
batでファイル名を変更したい(...
-
vbsからのExcelマクロ呼び出し...
-
5000個のtiffファイルをpdfへ変...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access VBAから使用したExcelプ...
-
エクセルのマクロについて教え...
-
DataTableに入っているデータを...
-
Eclipseのコード入力時の、行コ...
-
C++言語で、構造体のコピーは可...
-
プログラムについて。
-
エクセルVBA 実行時エラー'...
-
Ctrl + Cなど複数の入力キー...
-
マウントしたディスクにcpで、...
-
Activesheet.Pasteで困っています
-
一行おきに貼り付ける 可能でし...
-
Listviewに表示された文字のコ...
-
文字列の切り出し
-
arduino unoからデータを読み出...
-
シートに張り付けたボタンがシ...
-
ブラウザからコピペすると文字...
-
ROBOCOPYをスペース付きのフォ...
-
バッチで当日日付で作成される...
-
jakarta poiを使用し、EXCELの...
-
ACCESS VBAでExcelを開き行をコ...
おすすめ情報