プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • C++
  • 【C++】「ライブラリ(スタティックライブラリ、DDL)」、STL(標準テンプレートライブ…
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【C++】「ライブラリ(スタティックライブラリ、DDL)」、STL(標準テンプレートライブラリ)など

03.10

  • miyabisan2
  • コメントを書く

この記事は3分で読めます

「ライブラリ」とは?

「オブジェクトファイル」を束ねて作るものには実行ファイルがありますが、「ライブラリ」という形で出力もできます。

ライブラリの種類

  • 静的ライブラリ
  • 動的(共有)ライブラリ(DDL)

静的ライブラリ

本当に、オブジェクトファイルを束ねただけのもので、オブジェクトファイルと同様にリンクを行えます。

プログラムの実行前にリンク作業を行います。

メリット

ビルド時に、関数の使い方が間違っていればエラーになるので事前にバグをつぶすことができます。

また、exeの中に取り込まれるので誤ってライブラリがユーザーに消される心配もありません。

動的(共有)ライブラリ(DDL)

「実行ファイル」と「静的ライブラリ」の中間のような存在です。「ダイナミックリンクライブラリ(DDL)」とも呼びます。

単独で実行させることはできないですが、実行中のプログラムから参照させることができます。

プログラムの実行中にリンクを行います。

メリット

プログラムのリリース後でも、DLLさえ置き換えればアプリの挙動を変えることができるので拡張性が高いです。

DLLの作成をするには?

Visual C++であれば、Visual Studioで「ダイナミックリンクライブラリ」のプロジェクトを作成して、ビルドする必要があります。

その際に、DLLはバイナリデータなので、関数を識別させることができるようにエクスポート関数というエントリポイント的な目印をつける必要があります。

エクスポート関数を作成するには?

下記の2種類の方法があります。

  • _declspec(dllexport)キーワードを使う。
  • モジュール定義ファイルを使う。

作成したDLLを利用するには?

下記2つの方法があります。

  • 暗黙的なリンクを使う。
  • 明示的なリンクを使う。

暗黙的なリンクを使う。

DLLをVisual Studioでビルドした際に、DLLと同じ階層にLIBファイルができていると思います。

このファイルはインポートライブラリと呼ばれるもので、DLL内のエクスポート関数の位置情報が書き込まれています。

DLLは、使用するアプリのビルド時に静的にリンクが行われます。

また、これを使う際はlibだけでなく、他にはリンクするDLLや、エクスポート関数が定義されているヘッダファイルが必要になります。

明示的なリンクを使う。

プログラム中でLoadLibrary関数を使用して動的にリンクを行います。

明示的なリンクの場合は、必要なのは.dllファイルのみになります。

一般的には、DLLファイルのみのコチラを使うことが多くなるでしょう。

C++のライブラリ

C++の標準ライブラリのほとんどが「std名前空間」に属しています。

STL(標準テンプレートライブラリ)とは?

データ操作に使用できる汎用ルーチンの集まりです。大量のアルゴリズムが用意されています。

代表的なアルゴリズム

  • sort
  • find
  • lower_bound

sort

<algorithm>の関数のsortとして提供されており、並び替えを行わせることができます。

find

線形探索(先頭から順番に並び替える手法です。)を行わせることができます。<algorithm>の関数ののfindを使えば行わせれます。

lower_bound

二分探索(先頭から順番に並び替える手法です。)を行わせることができます。これも同じく<algorithm>の関数で提供されています。

vector

複数のオブジェクトをひとまとめにするためのC++の標準ライブラリに実装されている技術です。

よく使われるのは「std::vector」というコンテナになります。

同じ型のオブジェクトをメモリ上に並べて管理することができます。

初期化方法

1
Vector<T> 名前

または

1
Vector<T> 名前(要素数)

または

1
Vector<T> 名前{要素1,要素2,…}

vectorのループ

下記の方法のいずれかでvectorの要素はループで取り出すことができます。

  • for文を使う。
  • 拡張for文を使う。
  • イテレータを使う。

vectorへのアクセス方法

下記3つのアクセス方法があります。

  • アドレス
  • 添字
  • 反復子(イテレータ)
アドレス

vectorコンテナはメモリ上に格納されているのでアドレスを使ってアクセスできる。

構文

1
2
&コンテナ[0]
&コンテナ[0]+1

添字

vectorコンテナはメモリ上に格納されているので添字を使ってアクセスできる。

構文

1
2
コンテナ[0]
コンテナ[1]

反復子(イテレータ)

通常、std::list等のコンテナは、0番目の要素をポインタ変数にしても、それに2を足して2番目の要素にアクセスするというようなことができませんでした。(vector等のコンテナはできますが、全てのコンテナで統一されてはいません。)しかし、イテレータを使うことでそのような直感的なアクセスが可能になります。

構文

先頭要素を指す反復子

1
begin()

末尾要素を指す反復子

1
end()

ランダムアクセス反復子

「std::vector」等のコンテナはこちらになります。自由に場所を指定してアクセスできます。

双方向反復子

「std::list」や「std::set」等のコンテナはこちらにあたります。前後に差し引きすることでアクセスできます。

スポンサーリンク
  • 2019 03.10
  • miyabisan2
  • コメントを書く
  • C++
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2019 03.06

    【C++】「名前空間」、「変数(型推論なども)」、「クラス」、「関数」、「仮想関数」、「関数テンプレート」、「入出力演算子」

  2. 2019 05.19

    【VB.NET】VB.NETからC++のDLLを呼び出す方法

  3. 2019 03.09

    【C++】クラスのオブジェクト構築や、メモリの概念、スマートポインタ、参照ポインタ

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【C++】クラスのオブジェクト構築や、メモリの概念、ス…

【C言語】C言語の特徴、標準ライブラリ、C++の特徴、…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー