2017-05-16 5 views
0

「ヘッダー」が正しい単語であるかどうかわからないので、修正してください。WDKのC++での配列のヘッダーサイズ

私はまずメモリを割り当てて、オーバーロードされた(配置)new []演算子を使ってクラスオブジェクトの配列(MyClassなど)を初期化しようとしています。

と言うと、MyClassオブジェクトのサイズは0x68で、0x20の配列が必要です。したがって、合計サイズはsizeof(MyClass)* 0x20 = 0xD00です。

は今、私は私のオーバーロードされた配置の新しい[]演算子を使用する場合:新しい[]演算子に

pArr = new(pAllocatedMem)MyClass[0x20]; 

コンパイラ返さsize_tのは、実際に0xD08です。余分な8バイトがあります。その8バイトの値を見ると、配列のサイズ(ここでは0x20)を格納するために使用されます。

これは、私が使用できるWDKのヘッダサイズとは何ですか?このサイズの変更はコンパイラやそれ以外のものによって異なりますか?

答えて

2

その余分なスペースがあれば、それはコンパイラに依存します。ランゲージ定義の場合:

[It]は、配列の割り当てのオーバーヘッドを表す負でない不特定の値です。 new-expressionの結果はoperator new []によって返された値からこの量だけオフセットされます。

通常、実行時には、deleteがアレイ上で最終的に呼び出されたときに破壊するオブジェクトの数を知るために使用されます。

+0

このVCのオーバーヘッドが常に定義されているかどうか知っていますか? – Andrew

+0

@Andrew:あなたはソースを持っています。しかし私はそれが公式だとは思わない。リリース間で変更される可能性があります。結局のところ、移植可能なコードはそれにも頼ることができないので、なぜVCはそれを文書化して利益を得るのでしょうか? – MSalters

+0

@MSalters、**少なくとも私のプログラム(ドライバ)を実行する同じインスタンス内で、オーバーヘッドの保証は同じですか?**新しい[]配置を安全に使用できないようです。割り振られたメモリを解放すると、その不特定のオーバーヘッドが正しく説明されていない場合、BSOD(私はWindows上にあります)が発生します。私は削除の間にパラメータを渡す必要がありますが、delete []は追加の引数を取ることができません。新しい/ deleteの外部にメモリを割り当てると、このオーバーヘッドが発生します。 – Andrew

0

答えに自分自身を追加する。 同僚と少しテストをしました。初期化されるクラスにデストラクタ関数が定義されている場合、VSコンパイラは配列サイズを格納するオーバーヘッドを必要とします。デストラクタもオーバーヘッドもありません。それはバグか機能ですか?

#include <malloc.h> 
#include <new> 

class Foo 
{ 
public: 
    //Foo() {} 
    //~Foo() {} // <-- will cause overhead even with user-allocated memory passed to placement new() 
    int a; 
}; 

int main() 
{ 
    int n = 0x10; 
    size_t size = sizeof(int) * 2 + sizeof(Foo) * n; 
    void* p = malloc(size); 
    *((int*)p) = 0xaaaaaaaa; 
    *(int*)((char*)p + size - sizeof(int)) = 0xbbbbbbbb; 
    // Placement new with user-allocated memory 
    Foo* pf = new ((char*)p + sizeof(int)) Foo[n]; 
    for (int i = 0; i < n; i++) 
    { 
     pf[i].a = i; 
    } 
    free(p); 
    return 0; 
}