自分で作ったテーマ

7673 ワード

1.c/c++の論理演算で、Trueと考えられる数字は何ですか.--0以外の数値
2.インライン関数とは?
inline                    。。。

コンピュータ科学では、インライン関数(オンライン関数またはコンパイル期間展開関数と呼ばれる場合もある)は、コンパイラがいくつかの特殊な関数をインライン拡張することを提案するためのプログラミング言語構造である(オンライン拡張と呼ばれる場合もある).すなわち、コンパイラは、指定した関数体を挿入して、関数を呼び出す場所(コンテキスト)に置き換え、関数を呼び出すたびに余分な時間を節約することを推奨します.しかし、インライン関数の使用を選択する場合は、複雑な関数をインライン拡張しすぎると、ストレージリソースのコストが大きくなるため、プログラムの占有スペースとプログラムの実行効率の間で比較する必要があります.また,再帰関数のインライン拡張が一部のコンパイラの無限コンパイルをもたらす可能性があることにも注意すべきである.
 
3.メモリの位置合わせとは?
構造体のメモリレイアウトは、CPU、オペレーティングシステム、コンパイラ、コンパイル時の位置合わせオプションに依存します.構造体の内部メンバーの位置合わせの要件、構造体自体の位置合わせの要件.最も重要なのは3つです
(一)メンバーの位置合わせ.構造体内部のメンバーについては、通常、各メンバー変数が格納する開始アドレスの構造の開始アドレスに対するオフセット量が、その変数のタイプに占めるバイト数の倍数でなければならないという規定がある.しかし、一部のフィールドが厳密にサイズに従って緊密に並べられている場合、このような目的を達成できない場合があるため、paddingを行わなければならない場合もあることがわかります.各メンバー変数は,格納時に構造に現れる順に空間を順次申請するとともに,上の位置合わせで位置を調整すると,空きバイトコンパイラが自動的に埋め込まれるすなわちpaddingである.
(二)次に,構造体全体の整列要件も考慮する.ANSI C規格では、構造体タイプの整列要件は、すべてのフィールドで最も厳格な緩和要件よりも厳しくなく、より厳格であることが規定されています.実際には、構造体は、少なくともその最大の要素サイズの整数倍であることが要求される.構造体配列を使用する場合があるため、構造体の大きさは、構造体配列内の各構造体が整列要件を満たすことを保証するとともに、独立した構造体と構造体配列内の単一構造体の大きさが一致しなければならない.
(三)コンパイラの位置合わせ命令.VCには、変数をnバイトで整列するように設定するためのpragmapack(n)が設けられている.nバイトアライメントとは、変数が格納される先頭アドレスのオフセット量の2つのケースがある.第1に、nが変数が占有するバイト数以上である場合、オフセット量はデフォルトのアライメント方式を満たさなければならない.第2に、nが変数のタイプが占有するバイト数未満である場合、オフセット量はnの倍数であり、デフォルトのアライメント方式を満たさない.構造の合計サイズにも制約があります.nがすべてのメンバー変数タイプが占有するバイト数より大きい場合、構造の合計サイズは、占有領域が最大の変数が占有する空間数の倍数でなければなりません.
 
4.「伝値」、「伝針」、「伝引用」の役割?
≪値の転送|Value Transfer|emdw≫:関数に入力値のみを入力し、コピー・オーバーヘッドが必要です.大きなオブジェクトでは値の転送はあまり使用されません.
ポインタ転送:ポインタがコンテンツを指す値を変更できますが、ポインタ自体を変更することはできません.コピーオーバーヘッドは必要ありません.ポインタ自体を変更する必要がある場合は、二重ポインタまたはポインタリファレンスを使用します.
≪参照転送|Reference Transfer|emdw≫:入力値のほかに、コピーオーバーヘッドを必要とせずに操作結果が返されます.
ベースタイプの値、通常の非マルチステートオブジェクト参照、マルチステートオブジェクト、およびスタックに割り当てられたオブジェクトポインタ.
5.暗黙的コピーコンストラクタで発生する可能性のある問題
コピーコンストラクション関数と付与関数をプロアクティブに作成しない場合、コンパイラはデフォルトの関数をビットコピーで自動的に生成します.クラスにポインタ変数が含まれている場合、この2つのデフォルトの関数にはエラーが隠されています.クラスStringの2つのオブジェクトa,bを例に、a.m_dataの内容は「hello」、b.m_dataの内容は「world」です.
aをbに割り当て、デフォルトの割り当て関数の「ビットコピー」はb.m_を実行することを意味する.data=a.m_data.これにより、3つのエラーが発生します.1つはb.m_です.dataの元のメモリが解放されず、メモリが漏洩した.二つ目はb.m_dataとa.m_dataは同じメモリを指し、aまたはbのいずれかの一方の変動が他方に影響を与える.三つ目は、オブジェクトが解析されたとき、m_dataは2回解放された.
6.虚析构関数の役割?
虚と書くのは,マルチステートを実現する際にメモリ漏洩を起こさないためである.
7.   Int a=b*4 int a=b/16 int a=(b+c)/2 int a=(b*3)/8 int a=(b%8)*4
8.コード出力結果
Class  A{
      A(){printf(“1”);}
~A(){printf(“2”);}
Void  print(){
      Printf(“3”);
}
};
Class B:public A{
B(){printf(“4”);}
~B(){printf(“5”);}
Virtual Void  print(){
      Printf(“6”);
}
};
Class C:public B{
C(){printf(“7”);}
~C(){printf(“8”);}
Virtual Void  print(){
      Printf(“9”);
}
};
Int  main(){
A*a=(A*)new B;
a->print():
B*b=(B*)new c;
b->print();
delete a;
delete b;
}
39285
1、1つの関数を書く:bool fun(int num)は1つの数字が質数であるかどうかを判断することを実現する.
bool fun(int num) 
{  
if (num == 0 || num == 1 ) { 
printf("0 1
");  return false;  }//end if  if (n == 2 || n == 3) {  return true;  }
    int j,k;  
    bool flag=true;  
    k=sqrt(num);  
    for(j=2;j<=k;j++)  
    {  
        if(num %j==0)  
        {  
            flag=0;  
            break;  
        }  
    }  
    if(flag)  
        return true;  
    else 
        return false;  
} 

2、1つの関数を書きます:void disp()は1から100の数字を出力して、もし数字が3の倍数ならばNabを出力して、もし数字が5の倍数ならばZifを出力して、もし数字が3の倍数ならばまた5の倍数ならばZifNibを出力して、その他の情況はこの数字を出力します.
void disp(){
    for(int i=1;i<=100;i++){
        if((i%3==0)&&(i%5==0)){
            cout<            continue;
        }
        if(i%3==0){
            cout<            continue;
        }
        if(i%5==0){
            cout<            continue;
        }
        cout<    }
}
3、1つの関数を書いて、short fun(int color)は1つの32ビットの色値を16ビットに圧縮して、圧縮方式は通常色値の低位を捨てて、高位を保留して、32ビットの色値のフォーマットはXXXXXXXXXXRRRRRGGGGGGGGBBBBBBBBBBBBBBで、8ビットを仮定しても役に立たない.圧縮後の16ビットの色値はRRRRRBBBBGGGGであるべきである.
short fun(int color)
{
    return color&0x0fff;
}
4、1つの関数を書いて文字列の圧縮記憶を実現し、関数の原型はvoid fun(char*str)であり、入力文字列にアルファベットしか含まれていないと仮定し、圧縮方式は:文字列に連続して同じ文字が現れた場合、文字の再復回数+文字符そのものとして記憶し、文字が連続して現れない場合、ソース文字を記憶し、例えば、strStr="ABBCCCDBB"の場合、圧縮された文字列は"A 2 B 3 CD 2 B"となる.
#include
#include
void f(char *str)
{
char *des=(char *)malloc(100*sizeof(char));
char *s=des;
int cnt=0;
while(*str)
{
cnt++;
str++;
if(*str!=*(str-1))
{
if (cnt !=1)
{
*des=cnt+0x30;
des++;
}
*des=*(str-1);
des++;
cnt=0;
}
}
des++; *des = '\0';
printf("%s",s);
}
void main()
{
char *str = "ABBCCCDBB";
f(str);
}
 
5:int max(int a,int b)を書いて、a,bの中の最大数を求めることを実現して、if else文を使うことができなくて、条件演算子を使うことができなくて、循環を使うことができなくて、switchを使うことができません.int max(int a, int b)
{
int buf[2]={x,y};
unsigned int z;
z=x-y;
z>>=31;
return buf[z];

}
6:1つの整数をシフト演算し、左シフト時に各コンパイラが最も右側に0をシフトしますが、右シフト時にコンパイラによっては左側に0をシフトし、一部のコンパイラがシンボルビットをシフトします.関数を書いてコンパイラの違いを遮断し、右シフト演算を私たちのやり方で0またはシンボルビットにシフトできるようにします.関数の原型はint fun(int num,int bit,int flag)、numはシフトする整形数字、bitはシフトするビット数、flagは0は最も左側のシフト0を表します.flagが0以外の場合は、シンボルビットに移動します.int   fun( int   num,  int   bit,  int   flag) {      int   s;      int   i;             for (i = 0; i < bit; i++)      {          s = num & 0x80000000;          num >>= 1;          if (flag && s)              num |= 0x80000000;          else              num &= ~0x80000000;                 } return num; }