Информация об изменениях

Сообщение Аллокация памяти и тредовый робот от 04.12.2021 18:21

Изменено 04.12.2021 18:25 avovana

Re: Аллокация памяти и тредовый робот
1. Cколько запросов на выделение памяти из кучи будет сделано при вызове каждой из данных функций?

void f1() {
    std::string s = "hello world"; // const char* 12 байт // SSO < 16 байт
}

void f2() {
    char const* s = "hello world"; // 12 байт // только для чтения
}

void f3() {
    std::unique_ptr<int> i(new int); // int на куче - 4 байт
}

void f4() {
    std::shared_ptr<int> i(new int); // 2 указателя . 1 - на выделенный объект, 2ой на счетчик
}

void f5(std::vector<int>& v, int i) { // int - в хорошем случае. size < capacity. | size == capacity => нету места для нового int. 1. аллокация. 2. переместить. 3. создать новый объект. 4. деаллцировать старую память
    v.push_back(i);
}

void f6(std::list<int>& l, int i) { // new int
    l.push_back(i);
}

void f7(std::vector<int>& v1, const std::vector<int>& v2) {
    v1 = v2; // operator=. сравнить size(). 1. v1 size достаточно. 2. v1.clear() 
}

void f8(std::list<int>& l1, const std::list<int>& l2) {
    l1 = l2;
}

void f9(std::string& s1, const std::string& s2) {
    s1 = s2;
}

void f10(std::vector<int>& v1, std::vector<int>& v2) { // ни одноой аллок
    v1.swap(v2);
}

void f11(std::list<int>& l1, std::list<int>& l2) {
    l1.swap(l2);
}

void f12(std::map<std::string, int>& m, char const* k) {
    int i = m[k]; 1. constr
}

void f13() {
    struct S {
        const char const* s;
        S(char const* const s) : s(s) {}
    };
    char storage[2 * sizeof(S)];
    S* s = reinterpret_cast<S*>(storage);
    new(s) S("hello world");
}

// Как сделать чтобы робот шагал сначала левой, потом правой, левой, правой...?
// Обобщить до 40жки, чтобы каждая нога двигалась за предыдущей
===========

int main()
{
    std::thread first([]()
        {
            while(true)
            {
                std::cout << "First" << std::endl;
            }
        }
    );
    std::thread second([]()
        {
            while(true)
            {
                std::cout << "Second" << std::endl;
            }
        }
    );
    first.join();
    second.join();

    return 0;
}
Аллокация памяти и тредовый робот
1. Cколько запросов на выделение памяти из кучи будет сделано при вызове каждой из данных функций?

void f1() {
    std::string s = "hello world"; // const char* 12 байт // SSO < 16 байт
}

void f2() {
    char const* s = "hello world"; // 12 байт // только для чтения
}

void f3() {
    std::unique_ptr<int> i(new int); // int на куче - 4 байт
}

void f4() {
    std::shared_ptr<int> i(new int); // 2 указателя . 1 - на выделенный объект, 2ой на счетчик
}

void f5(std::vector<int>& v, int i) { // int - в хорошем случае. size < capacity. | size == capacity => нету места для нового int. 1. аллокация. 2. переместить. 3. создать новый объект. 4. деаллцировать старую память
    v.push_back(i);
}

void f6(std::list<int>& l, int i) { // new int
    l.push_back(i);
}

void f7(std::vector<int>& v1, const std::vector<int>& v2) {
    v1 = v2; // operator=. сравнить size(). 1. v1 size достаточно. 2. v1.clear() 
}

void f8(std::list<int>& l1, const std::list<int>& l2) {
    l1 = l2;
}

void f9(std::string& s1, const std::string& s2) {
    s1 = s2;
}

void f10(std::vector<int>& v1, std::vector<int>& v2) { // ни одноой аллок
    v1.swap(v2);
}

void f11(std::list<int>& l1, std::list<int>& l2) {
    l1.swap(l2);
}

void f12(std::map<std::string, int>& m, char const* k) {
    int i = m[k]; 1. constr
}

void f13() {
    struct S {
        const char const* s;
        S(char const* const s) : s(s) {}
    };
    char storage[2 * sizeof(S)];
    S* s = reinterpret_cast<S*>(storage);
    new(s) S("hello world");
}

// Как сделать чтобы робот шагал сначала левой, потом правой, левой, правой...?
// Обобщить до 40жки, чтобы каждая нога двигалась за предыдущей
===========

int main()
{
    std::thread first([]()
        {
            while(true)
            {
                std::cout << "First" << std::endl;
            }
        }
    );
    std::thread second([]()
        {
            while(true)
            {
                std::cout << "Second" << std::endl;
            }
        }
    );
    first.join();
    second.join();

    return 0;
}