【Rust】ヒープ領域

ヒープ領域とは、プログラム実行時に動的にメモリを割り当てるための領域
ヒープ領域は関数が終わっても存在することができ、所有者が居なくなった時点で解放される

struct Point {
    x: i32,
    y: i32,
}

fn main(){
    let p: Box<Point> = Box::new(Point {x:100, y:200});
    println!("{} {}", p.x, p.y);
}

new演算子、std::vectorはヒープ領域を使用している。

#include <iostream>
#include <limits>
#include <exception>

int main()
{
    std::cout << std::hex << std::numeric_limits<uintptr_t>::max() << std::end;

    try {
        char* temp= new char[std::numeric_limits<uintptr_t>::max()];
        std::cout << temp << "\n";
    }
    catch(std::bad_alloc& e){
        std::cout << e.what() << "\n";
    }

    return 0;
}
#include <iostream>
#include <limits>
#include <exception>

int main()
{
    int* array = new int[5];

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

    delete[] array;
    array = nullptr;
    return 0;
}

いまいちboxの使い所と書き方がわかりませんな…

【Rust】文字列

Rustの基本的な文字列型は&strを使用する。

fn main(){
    let mut name: &str = "Yamada";

    println!("{}", name);

    name = "Tanaka";

    println!("{}", name);
}

ライブラリとして提供されている文字列にStringがある。

fn main(){
    let mut name = String::from("Yamada");

    name = "Tanaka".to_string();
    name.push_str(" Taro");
    println!("{}", name);
}

C++のchar型は1文字のみ

#include <stdio.h>

int main(void)
{
    char a = 'D';
    char b = 'N';
    char c = 'A';

    printf("%c%c%c\n", a, b, c);
    return 0;

}

複数文字は配列

#include <stdio.h>

int main(void)
{
    char str1[] = "DNA";

    printf("%s\n", str1);
    printf("%lu\n", sizeof(str1));

    return 0;

}

char型のポインタ

int main(void)
{
    const char* char_ptr = "DNA";

    printf("%s\n", char_ptr);

    return 0;

}

string型

#include <stdio.h>
#include <string>
#include <iostream>

int main(void)
{
    std::string str1 = "DNA";
    std::string str2 = "RNA";
    std::string str3 = str1 + str2;

    std::cout << str3 << std::endl;

    return 0;

}
fn main(){
    let s1 = String::from("ABC");
    let s2 = String::from("ABC");
    let s3 = String::from("XY");

    if(s1 == s2){
        println!("ABC == ABC");
    }
    if(s1 < s3) {
        println!("ABC < XY");
    }
}

String::fromが便利すぎる。。

【Rust】ハッシュマップ(Hashmap)

ハッシュマップは文字列を添字に使用することができる。他の言語では連想配列と呼ばれる。

use std::collections::HashMap;

fn main(){
    let mut map = HashMap::new();
    map.insert("x", 10);
    map.insert("y", 20);
    map.insert("z", 30);

    println!("{} {} {}", map["x"], map["y"], map["z"]);

    for (k, v) in &map {
        println!("{} {}", k, v);
    }
}

C++

#include <iostream>
#include <map>
#include <string>

using namespace std;

int main()
{
    map<int, string> Players;

    Players.insert(std::pair<int, string>(2, "Lin Dan"));
    Players.insert(std::pair<int, string>(1, "Chen Long"));

    cout << "Number of Players " << Players.size() << endl;
    for(map<int, string>::iterator it = Players.begin(); it != Players.end();
        ++it){
            cout << (*it).first << ": " << (*it).second << endl;
        }

}
use std::collections::HashMap;

fn main(){
    let mut Players = HashMap::new();
    Players.insert(2, "Lin Dan");
    Players.insert(1, "Chen Long");

    println!("{}", Players.len());

    for (k, v) in &Players {
        println!("{}: {}", k, v);
    }
}

$ ./main
2
1: Chen Long
2: Lin Dan

privateとprotectedの違い

private: 派生クラスからアクセスできない
protected: 派生クラスからアクセスできる

class Food {
//

protected:
	int price;
}

int main()
{
	Food myFood;
	cout << myFood.price << endl;
}

-> コンパイルエラー

いつもこんがらがる…

[c++] privateとprotectedの違い

アクセス指定子には、public, private, protectedがある。

public: すべての範囲からアクセスが可能
private: 同一クラスまたは同一インスタンス内でのみアクセス可能
protected: 同一クラスまたは同一インスタンス内もしくは、サブクラスおよびそのインスタンス内でのみアクセス可能

e.g.

//
protected:
    void TransactionAddedToMempool(const NewMempoolTransactionInfo& tx, uint64_t) override
        EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator);
    void TransactionremovedFromMempool(const CTransactionRef& tx, MempoolRemovalReason, uint64_t)
        EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator);
    void MempoolTransactionsRemovedForBlock(const std::vector<RemovedMempoolTransactionInfo>& txs_removed_for_block, unsigned int nBlockHeight) override
        EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator);

[c++] virtualの使い方

C++はクラスを継承する際に、デストラクタにvirtual修飾子を付けることが推奨されている。

e.g.
virtual ~Ambulance();

virtual修飾子は仮想関数として機能する。virtualが付いたメンバ関数の場合、子クラスでオーバーライドされた同名のメンバ関数が実行される。

#ifndef _BIRD_H_
#define _BIRD_H_

#include <iostream>
#include <string>

using namespace std;

class Bird {
public:
	virtual void sing();

	void fly();
};

#endif
#include "bird.h"

void Bird::sing(){
	cout << "鳥が鳴く" << endl;
}

void Bird::fly(){
	cout << "鳥が飛ぶ" << endl;
}

継承した仮想関数

#ifndef _CROW_H_
#define _CROW_H_

#include "bird.h"

class Crow : public Bird {
public:
	void sing();

	void fly();
};

#endif
#include "crow.h"

void Crow::sing(){
	cout << "カーカー" << endl;
}

void Bird::fly(){
	cout << "カラスが飛ぶ" << endl;
}

親クラスで定義するんだね。
親クラスで使わない場合は、=0として、純粋仮想関数とすることもできる。

#ifndef _BIRD_H_
#define _BIRD_H_

#include <iostream>
#include <string>

using namespace std;

class Bird {
public:
	virtual void sing() = 0;

	void fly();
};

#endif

仮想関数、純粋仮想関数など馴染みの無い名称だととっつきにくいが、内容は理解しました。

[c++] thisの使い方

キーワード this は、特定の型のポインターを識別する

using namespace std;

struct X {
private:
    int a;
public:
    void Set_a(int a){
        this->a = a;
    }
    void Print_a() { cout << "a = " << a << endl; }
}

int main(){
    X xobj;
    int a = 5;
    xobj.Set_a(a);
    xobj.Print_a();
}

[c++] cstdio

The header file is a part of the C++ standard library collection that provides the input and output methods of library of C language. We can use the traditional C-style input and output method in C++ using the library. It also contains all the functions and macros of library of C language.

#include <cstdio>

using namespace std;

int main() {
    int number = 10;

    printf("value of variable \"number\": %d", number);
}

[c++] #define __atribute__

– The __attribute__ directive is used to decorate a code declaration in C, C++ and Objective-C programming languages. This gives the declared code additional attributes that would help the compiler incorporate optimizations or elicit useful warnings to the consumer of that code.


__attribute__((constructor)) is a GCC compiler extension in C++ that allows you to specify a function that should be executed automatically before the main function of your program.

[c++] ifdefディレクティブ

条件付きコンパイラ
#ifdef および #ifndef のディレクティブは、#if を使用できるところならどこでも使用できる。

#defineはプリプロセッサ(コンパイル前の処理)を行う