0

最初の場所へのポインターを渡すことによって、配列が関数に渡されるコードに取り組んでいます。関数では、配列の一部が使用されます。呼び出し元の関数が配列の最大サイズを正しく推測しない場合、呼び出し先の関数が配列サイズを超えて書き込み、スタック オーバーフローが発生する可能性があるため、これは危険な状況を生み出します。これに対する解決策を考えていたので、この例に示すように、関数テンプレートを使用して配列を参照として渡すことを考えました。

変更配列.h

#define MAXSIZE 10

class modifyArray
{    
public:
    void create();

    void unsafeFunction(double*);

    template<int N>
    void safeFunction(double (&array)[N] );

private:
    int computeLength();
};

変更配列.cpp

#include <iostream>
#include "modifyArray.h"

int modifyArray::computeLength()
{
    return 11;
}

void modifyArray::create()
{
    double testarray[MAXSIZE];
    unsafeFunction(testarray);    
    safeFunction(testarray);
}

void modifyArray::unsafeFunction(double* array)
{
    int operatingSize = computeLength();
    for(int i = 0; i < operatingSize; i++) {
        array[i] = i*i;
    }
}

template<int N>
void modifyArray::safeFunction(double (&array)[N] )
{
    int operatingSize = computeLength();
    std::cout<< "Max size" << N <<std::endl;
    if(operatingSize > N) return; // Return or raise an exception

    for(int i = 0; i < operatingSize; i++) {
        array[i] = i*i;
    }
}

main.cpp

#include "modifyArray.h"    

int main(int argc, const char * argv[]) {    
    modifyArray C;    
    C.create();
    return 0;
}

既存のコードへの侵襲を最小限に抑えるソリューションを探しています。ここでは、テンプレート ステートメントを追加し、引数を double* から参照に変更し、if ステートメントを挿入してサイズを確認するだけです。大幅な書き直しはしたくありません。また、主にパフォーマンス上の理由から、動的割り当て、ベクトル、または std::array を使用したくありません。これは、数値シミュレーション コードの低レベル関数であり、パフォーマンスが非常に重要です。より良い解決策はありますか?私がしていることに落とし穴はありますか?

4

1 に答える 1

4

生の配列を実際に操作したい場合、配列のすべての要素を安全に最後まで移動せずに変更したい場合は、配列を参照渡ししてから、範囲ベースの for loop を使用できます。

tmeplate <typename T, typename Function, std::size_t N>
void do_work(T (&arr)[N], Function f)
{
    for (auto & e : arr)
        e = f();
}

上記は、関数を呼び出した結果を配列のすべての要素に適用し、配列の境界内にとどまることが保証されています。あなたはそれを次のように使うことができます

int main()
{
    int arr[10];
    do_work(arr, []() { static int i = 0; i++; return i * i; });
    for (auto e : arr)
        std::cout << e << " ";
}

出力:

1 4 9 16 25 36 49 64 81 100 

Live Example

于 2016-04-26T14:36:20.533 に答える