75612


C++での`配列(固定長)`には以下の2つがあると思いますが、`std::array`の方が確実に便利だと感じます。  
そこで完全に`std::array`に移行する際に、`std::array`にデメリットはないのかなと思い、質問させていただきました。

[code]

    int arr[10];
    
[/code]

[code]

    #include <array>
    
    std::array<int, 10> arr;
    
[/code]


CC BY-SA 4.0
2021-05-01T06:27:05.480
75610
2021-05-07T14:41:05.603
2021-05-01T06:56:03.643
40856
40856
question
c++
C++での通常の配列と比べてstd::arrayを使う際にデメリットはありますか?


既存の関数が、 `int*` 等のポインター型を要求することが多々あります。  
その際、C配列 `int arr[10]` ですと、歴史的に `arr` は `int*` へ暗黙変換が可能なのでそのまま渡せます。  
対してC++配列 `std::array<int, 10> arr` ですと、 `arr.data()`
等の記述が必要になりその部分が煩わしくなるかもしれません。  
どちらであっても [`std::data(arr)`](https://ja.cppreference.com/w/cpp/iterator/data) で
`int*` が取得可能なので、まずはそのように記述しておくのも一つの手です。

> 配列の長さを取得する際にめんどくさいなと感じ

こちらも [`std::size(arr)`](https://ja.cppreference.com/w/cpp/iterator/size)
でC配列・C++配列両方の長さを取得できます。

* * *

なお、C++20では[`std::span`](https://ja.cppreference.com/w/cpp/container/span)も登場しています。関数を設計する際、引数は`std::span`で受け取るという選択肢もあります。`std::span`でしたら、C配列・C++配列だけでなく`std::vector`なども使用可能です。


CC BY-SA 4.0
2021-05-01T07:54:19.113
75612
2021-05-01T23:16:20.870
2021-05-01T23:16:20.870
4236
4236
75610
answer


> 完全に`std::array`に移行する際に、`std::array`にデメリットはないのか

配列型`T[N]`よりも新しい`std::array<T, N>`コンテナ利用を推奨します。が、あえてデメリットを挙げるとしたら：

  * C++11／14までは`std::array`のconstexpr対応が不完全なため、配列型でないとconstexpr関数を実装できないケースがありました。C++17以降では要素アクセスや`begin`/`end`もconstexpr対応したため、素直に`std::array`を利用できます。
  * 多次元配列の宣言を行う場合は、配列型に比べると`std::array`利用時の型名が複雑になりがちです（単に慣れの問題もあるとは思います）。


CC BY-SA 4.0
2021-05-06T03:02:36.060
75689
2021-05-06T03:02:36.060
49
75610
answer


`std::array`はテンプレートを利用した実装なので、組み込み配列型を使用した場合と比べるとコンパイル時間やコードサイズが増大してしまう可能性はあります。  
また、コンパイラによる最適化がうまく効かない場合、組み込み配列型よりも実行速度が低下してしまうケースがあるかもしれません。もちろん、逆に`std::array`を使ったほうが高速化されるケースもあると思います（特にサイズの小さい固定長配列全体を、関数に値渡しする場合）。  
インライン化できるような場面では、最終的に`std::array`を使った場合も組み込み配列型を使った場合もまったく同じコンパイル結果になると思いますが、コンパイラの実装にも依存します。


CC BY-SA 4.0
2021-05-07T14:33:28.383
75730
2021-05-07T14:41:05.603
2021-05-07T14:41:05.603
15413
15413
75610
answer