C++相談室 part15

このエントリーをはてなブックマークに追加
>>928
境界に沿わないアクセス許してるCPUの方が少ないと思うんだが。
IA-32の場合でも、例外にはならなくとも遅くなるから普通は避ける。

>>930
Pentium以降のデータバスは64bit。

QWORDの方が早い(速い、だろ?)って意味がわからんが、
パック命令は1命令で複数回の演算を行うんだから、
専用に最適化すれば速くて当たり前。

レジスタ <-> メモリ間の転送速度も、別にパック演算命令
使わんでも64bit転送を使えるんならそっちの方が速い。

つか、思いっきりスレ違いだな。
934デフォルトの名無しさん:03/02/20 11:10
クラスのメンバーにクラスを宣言すると、
メンバーのクラスの生成と破棄は自動で行われますか?

delphiだと、コンストラクタとデストラクタで自分でやらなきゃならなかったんですが。
935934:03/02/20 11:13
後、分からないのが、staticでクラス変数宣言出来るのでしょうか。
やっぱ、クラスのポインタの変数宣言しか無理なのかな。
>>934
まず質問する前にデバッガでコンストラクタとデストラクタの動きを追うがヨロシ。
staticなクラス変数は宣言できますが何か?
937934:03/02/20 13:12
ごめんなさい。
コンパイルは両方出来ました。
後は、デバッガ。

というより、みんなどうしてんのかな。自分変なことしてないよな、を確認したかっただけです。
938デフォルトの名無しさん:03/02/20 14:35
質問スレ31の981です。
こんな質問をしたら

 981 名前 : デフォルトの名無しさん Mail : 投稿日 : 03/02/20 03:04

 STLのvectorについて質問です。
 fread()の様に配列にデータを流し込むタイプの関数からデータを受け取りたいのですが、

  vector<char> vc[100];
  fread(static_cast<void *>(&vc[0]), 100, 1, in );

 こんな感じで &vc[0]をポインタにして受け取っていいのでしょうか。

 983 名前 : デフォルトの名無しさん Mail : sage 投稿日 : 03/02/20 03:11

 >>982
 C++関連のスレいってログ嫁。

と言われてしまいました。
過去ログは一応探したつもりで、STLスレでfread()がらみの質問もあったのですが
それではきちんと整合が取れるか(size()を問い合わせたりしても正常に動くか)
までは言及されていないようでした。

ご存知の型、ご指導下さい。
>>938
>vector<char> vc[100];

vc(100)です、質問スレ982も私が書いたもので
この訂正をしてあります。
>>938
それは処理系依存なんでやらない方がよい。
begin〜endまでが連続したメモリー上にあるとは限らん。
素直に一時的なバッファを用意してやる方が吉。
>>938

>>871
というのをどっかで読んだが、俺は使わないことにしてる
Effective STL第2章参照
>>940-941
レスありがとうございます。
こんなテストのコード書いてみると

 FILE *in = fopen("ファイル名", "rt");
 int filesize = 0;
 vector<char> vc;

 vc.clear();
 fseek( in, 0, SEEK_END );
 filesize = ftell(in);
 fseek( in, 0, SEEK_SET );

 printf("vector size : %d\n", vc.size());
 printf("vector capacity : %d\n\n", vc.capacity());
 
 vc.reserve(filesize);
 printf("vector size resized to %d\n\n", filesize);

 printf("vector size : %d\n", vc.size());
 printf("vector capacity : %d\n\n", vc.capacity());

 printf("-- fread() -- \n\n");

 fread(static_cast<void *>(&vc[0]), filesize, 1, in );

 puts(&vc[0]);
 printf("vector size : %d\n", vc.size());
 printf("vector capacity : %d\n\n", vc.capacity());

結果

vector size : 0
vector capacity : 0

vector size resized to 366

vector size : 0
vector capacity : 366

-- fread() --

(略)、ファイルの中身が表示される

vector size : 0
vector capacity : 366

のように、sizeは0のままで、いつか破綻しそうで気持ち悪いですので
アドバイスのように自前でバッファを管理することにします。
>>942
>Effective STL第2章参照

レスありがとうございます。
以前立ち読みはしたのですが、stringの便利さについては異議なしですが、
vectorはまだ便利さが理解できません。

Effective STLを見たところ、vectorを渡す、
つまりvectorから例えばconst char *に渡すときには
&v[0]でいいよ、ということは分かるのですが、
vectorにたいして書き込みたいときはどうするの?
ってことは書いていなかったような気がします。
もし、fwrite()を使いたいのならこれでいいのですが。

stringではoperator =があるので、代入も簡単ですが。
>>945
P.74
>>943
reserve() ではなくて resize() でしょ。

int main()
{
int filesize = 100;
std::vector<char> vc;

vc.clear();

std::cout << "vector size : " << vc.size() << std::endl;
std::cout << "vector capacity : " << vc.capacity() << std::endl;

vc.resize(filesize);
std::cout << "vector size resized to " << filesize << std::endl;

std::cout << "vector size : " << vc.size() << std::endl;
std::cout << "vector capacity : " << vc.capacity() << std::endl;
}
ちなみに reserve() ってのは何かと言うと、std::vectorの要素数
を変更した場合は常にメモリの再割り当てが行われるわけでは
ない。

STLの実装にもよるが、通常 capacity() 以上の size() にしようと
すると、capacity() は size() の2倍のメモリを確保して再割り当て
するものが多い。

つまりは効率のため。要素を一個 push_back() する度に再割り当て
してたら遅くて仕方ないから、余裕を持ってメモリ確保されている
訳です。その確保されてるメモリを返すのが capacity()。
949デフォルトの名無しさん:03/02/20 17:41
VC++ 6.0で分割コンパイルに挑戦したら 'class'で示される型として既に定義されてますと出てきますた。
---------------------
A.h
class A {
};
---------------------
A.cpp
#include "A.h"
---------------------
B.h
#include "A.h"
#include "C.h"
class B : public A {
C *a;
};
---------------------
B.cpp
#include "B.h"
---------------------
950デフォルトの名無しさん:03/02/20 17:42
C.h
#include "A.h"
#include "B.h"
class C : public A {
B *a;
};
---------------------
C.cpp
#include "C.h"
---------------------
MAIN.h
#include "B.h"
#include "C.h"
---------------------
MAIN.cpp
#include "MAIN.h"
int main()
{
B *b;
C *c;
}
---------------------
雛形はこんな感じなんでつが、原因と解決法はいかがなもので?
ソース、ヘッダ共に全部別ファイルでつ。
連続投稿スマソ
>>950
インクルードガードしなさい。
>>950
簡単に言うと、C.hはA.hとB.hをインクルードしているが、B.hもA.hを
インクルードしているので、class A の定義が2回されてしまうから
エラーが出る。
レスありがとうございます。

>>946
>P.74

確認してみます。

>>947
>reserve() ではなくて resize() でしょ。

そのようでした。
そこだけ直したところ

vector size : 0
vector capacity : 0
vector size resized to 366
vector size : 366
vector capacity : 512
-- fread() --
(略)
vector size : 366
vector capacity : 512

となり、すっきりしました。

>>948
>ちなみに reserve() ってのは何かと言うと

解説ありがとうございます。
STL標準講座のvectorメンバ関数表にはなぜかresize()がないけど
その後の解説にはreserve()とresize()がありました、見落としていたようです、済みません。
954950:03/02/20 18:13
>>951
どーもです。
あの・・・インクルードガードって何でつか?(大恥)

>>952
どーもです。
その対処法が951氏が言ってるインクルードガードなんでつか?
>>954
例えば、A.hは

#ifndef CLASSA
class A {
};
#define CLASSA
#endif

としてやってご覧。こういうのをインクルードガードという。
956デフォルトの名無しさん:03/02/20 18:21
>>955
おおっ、そーでしたか、大感謝。
俺 #pragma once が大好きなんだが、gccにobsolete とかいわれるので腹が立つ。ほっといてくれよ。
>>957
gccを再コンパイルすればいいじゃん。
それよりgccのワーニングを細かく抑制するほうほうが知りたい。
>>959
そんな荒いやつじゃなくて、VCみたいに番号で細かく指定したいんだが。
>>960
gccを再コンパイルすればいいじゃん。
つーかキリのいい番号取ったやつ次スレよろ。
「962番」はキリのいい番号だよな、みんな
次スレマダー?
966デフォルトの名無しさん:03/02/27 15:18
Write a program that adds all values stored in the array val and displays the
total. Modify the program to calculate and display the total of each row.
967デフォルトの名無しさん:03/02/27 15:18
Write a program that specifies three one-dimensional arrays named price,
quantity and total. each array should be capable to hold ten elements.
using a for loop, input values for the price and amount arrays. The entries
in the total array should be the product of the corresponding values of
the price and quantity arrays. After all the data have been entered, display an output
as a table in the following.
total price quantity
>>966-967
die.
価格、量および合計と命名される3つの一次元の配列を指定するプログラムを
書きます。各配列は10の要素を保持するのに有能に違いありません。
使用、1つの、ループ、価格に対する入力価値および量配列のために。
配列の合計中のエントリーは価格と量の配列の対応する値の製品であるべき
です。
データがすべて入力された後、下記中のテーブルとして出力を表示してください。
価格量の合計
970デフォルトの名無しさん:03/02/27 17:04
プログラミングを始めたんですが、わからないことがあるので教えてください。
開発環境:C++(VisualC++.NET)です。

#include <stdio.h>

main()
{
printf("Hello!\n");
}

このようなプログラムを作成して実行したところ、一瞬だけウィンドウが表示されるのですがすぐ消えます。
このあとに何を書き込めばとまるんでしょうか??
>>970
マルチ氏ね
>>970

int i;
scanf("%d", &i);
973デフォルトの名無しさん:03/02/28 00:33
>>852
ガッ
>>970
(σ・∀・)σゲッツ!
>>970
>開発環境:C++(VisualC++.NET)です。

どこから見てもC++じゃないだろ
976デフォルトの名無しさん:03/03/12 21:09
#include<cstdio>
int main(){
std::printf("Hello!!\n");
return 0;
}
VC++ にあるかどうか知らんけども getch() とか。
あちきは BCC だがこれよく使う。
>>970 はコマンドプロンプトを触ったことがないのとかと小一時間…

979デフォルトの名無しさん:03/03/12 21:28
>>970
ある意味スレ違い。
>>977
VC++にはgetch()はないから_getch()だろ。
_getch() か、そっちのが処理系依存ぽくていいな。
このスレはレベルが乱高下するな。
それにしても>>970はひどすぎる。