ポインタによる構造体メンバーへのアクセス

user2205092

定数ポインターとして関数に渡す構造体があります。質問は次のとおりです。関数updatedFieldsの2つの実装には違いがあります。

typedef struct
{
    int spec[100];
    int spec1[200];
    int spec2[200];
    int spec3[500];
    int spec4[100];
    int spec5[700];
    float value[100];
    char desc[1000]:
}t_product;



void updateFields_1(t_product const* context)
{

    int i,buffer[1500];
    int * pt_int;

    pt_int = (int*)context->spec1;      
    for(i = 0; i < 200; i++)
    {
        buffer[i] = pt_int[i];
    }

    pt_int = (int*)context->spec3;        
    for(i = 0; i < 500; i++)
    {
        buffer[i] = pt_int[i];
    }

    ...
}

void updateFields_2(t_product const* context)
{

    int i,buffer[1500];

    for(i = 0; i < 200; i++)
    {
        buffer[i] = context->spec1[i];
    }

    for(i = 0; i < 500; i++)
    {
        buffer[i] = context->spec3[i];
    }

    ...
}

int main(void)
{
    t_product prod;

    /* Initialisation of the structure */
    ...

    updateField(&prod);

}

つまり、構造体のメンバーに直接アクセスする代わりに、構造体のメンバーへのポインター(配列へのポインター)を使用する利点があります。

おそらくばかげた質問ですが、構造体メンバーへのアクセスにさらに多くの操作が「かかる」かどうかはわかりません。

ElderBug

あなたの場合、それ以上の費用はかかりません。最適化がなくても。実際、pt_int最適化を有効にしないと例が少し悪化する可能性があります。

これは、context->spec3[i]がより多くのポインタを逆参照していないためですpt_int[i]pt_int[i]は単なるポインタとオフセットであるため、アクセスは@(ptr_int + 4*i)として記述できますではcontext->spec3[i]、逆参照されたポインタがもう1つあるように見えるかもしれませんが、そうではありません。spec3の値ではなく、contextコンテキストからのオフセットにすぎませんしたがって、アクセスするアドレスはになります@(context + 2000 + 4*i)ポインタアクセスは1つだけです。

今、あなたは@(context + 2000 + 4*i)より多くの費用がかかるかどうか疑問に思うことができます@(ptr_int + 4*i)x86、AMD64、ARM(つまり、100%パーソナルデバイス)を含むほとんどのアーキテクチャには、一定のオフセットでアクセスを行うための命令があるため、そうではありません。また、簡単な最適化を有効にするとすぐに違いがなくなるcontext + 2000可能性があります。これは、単一に変換できるためですcontext_2000(ただし、パフォーマンスを悪化させるだけなので、コンパイラーは実際にはそれを行いません)。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

その構造体タイプのダブルポインタによる構造体のメンバーへのアクセス

その構造体タイプのダブルポインタによる構造体のメンバーへのアクセス

構造体へのポインタへのポインタのメンバーにアクセスするにはどうすればよいですか?

構造体メンバーの文字ポインターへのアクセス

構造体へのポインタのメンバーにアクセスするにはどうすればよいですか?

ポインタを使用して多くの構造体をポイントし、構造体データメンバーにアクセスする

ポインタのキューから構造体のメンバーにアクセスする

配列を持つ 2 つの構造体へのポインターによるアクセス

ポインタを介して別の構造体のメンバーにアクセスする

ポインタ演算を介した構造体データメンバーへのアクセス

構造体による配列へのアクセス(ポインターを使用)

ポインタ構造体のメンバー変数にアクセスする方法は?

ポインタを使用して構造体のメンバーにアクセスする

その構造体へのポインタを含む構造体へのポインタを使用して、構造体のメンバーにアクセスできますか?

構造体のvoidポインタを構造体にキャストしてメンバーにアクセスする

ポインタパラメータへのポインタとして関数に渡される構造体のメンバーにアクセスするにはどうすればよいですか?

ポインタとして設定された構造体の構造体メンバーにアクセスする方法は?

構造体メンバーにポインターとしてアクセスする方法

値またはポインタによる別の構造体へのアクセス

ポインタから構造体メンバーにアクセスする方法

ポインタを使用して構造体メンバーにアクセスする方法

構造体のメンバーにアクセスする方法

構造体の構造体のポインタにアクセスするときのセグメンテーション違反

構造体とvoidポインタへのアクセス

異なる構造体の配列のメンバーである構造体の配列内の構造体のメンバーへのアクセス

構造体ポインタ-ポインタを使用して構造体の配列にアクセスする

構造体のメンバーへのポインターを使用して、同じ構造体の別のメンバーにアクセスできますか?

構造体へのポインターを理解することは、それにアクセスする際に c のポインター メンバーを参照します。

構造体メンバーとしての構造体へのポインタ

TOP 一覧

  1. 1

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  2. 2

    CSSのみを使用して三角形のアニメーションを作成する方法

  3. 3

    ZScalerと証明書の問題により、Dockerを使用できません

  4. 4

    ドロップダウンリストで選択したアイテムのQComboBoxスタイル

  5. 5

    別のホストからTomcat Managerアプリにアクセスする

  6. 6

    PyCharmリモートインタープリターはプロジェクトタブにサイトパッケージのコンテンツを表示しません

  7. 7

    Windows 10でのUSB入力デバイスの挿入/取り外しの検出

  8. 8

    Python / SciPyのピーク検出アルゴリズム

  9. 9

    MLでのデータ前処理の背後にある直感

  10. 10

    useRefに反応してコンポーネントをスクロールして表示する

  11. 11

    モーダルダイアログを自動的に閉じる-サーバーコードが完了したら、Googleスプレッドシートのダイアログを閉じます

  12. 12

    パンダは異なる名前の列に追加します

  13. 13

    PictureBoxで画像のブレンドを無効にする

  14. 14

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  15. 15

    Pythonを使用して、リストからデータを読み取り、特定の値をElasticsearchにインデックス付けするにはどうすればよいですか?

  16. 16

    LinuxでPySide2(Qt for Python)をインストールするQt Designerはどこにありますか?

  17. 17

    Material-UIでTextFieldエラーの色を条件付きでオーバーライドする方法

  18. 18

    goormIDEは、ターミナルがロードするデフォルトプロジェクトを変更します

  19. 19

    MatplotlibまたはSeabornを使用して、グループ化されたデータから複数のプロットを生成するにはどうすればよいですか?

  20. 20

    Luaの文字列から特定の特殊文字を削除するにはどうすればよいですか?

  21. 21

    Flutterにファイルピッカープラグインを追加するにはどうすればよいですか?

ホットタグ

アーカイブ