С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/55: Рейтинг темы: голосов - 55, средняя оценка - 4.95
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274

Что такое std::string

30.10.2019, 21:59. Показов 10930. Ответов 68
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
int main(){
 
std::string s;
std::string st="it string";
for(int i=0; i<9; ++i){s[i]=st[i];};
 
 
std::cout << s;
 
}

скажите пожалуйста , что сейчас находится в s?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.10.2019, 21:59
Ответы с готовыми решениями:

Что такое std::string()
И скал в гугле- там ничего понимаемого. Начну, что я вообще в символьных не шарю. Обьясните пожалуста, что это и что оно делает. ...

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

Запрошено преобразование от ‘const std::string*’ к нескалярному типу ‘std::string’
private: std::string firstName; }; std::string ClientData::getFirstName() const{ return firstName; } Дает в итоге...

68
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
02.11.2019, 19:30
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Croessmah Посмотреть сообщение
Цитата Сообщение от _stanislav Посмотреть сообщение
Если доступная реализация string построена на подсчете ссылок
Книжка не учитывает современные версии C++?
Устаревший компилятор или библиотека могут не вполне соответствовать современным стандартам. Кроме того, в программах и библиотеках бывают ошибки.

Но в целом согласен: если книга не устарела до того, как её напечатали, то устареет до того, как её успеешь прочитать.
0
3 / 2 / 1
Регистрация: 02.11.2019
Сообщений: 7
02.11.2019, 19:33
В цикле Вы делаете копирование в непроинициализированную переменную типа std::string - класс, который представляет собой строку.
Размер вашей строки s = 0. Проверьте с пом. s.length()

C++
1
2
3
4
5
6
7
8
#include <iostream>
#include <string>
 
int main()
{
  std::string name;
  std::cout << name.length();
}
1
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
02.11.2019, 19:40
Цитата Сообщение от Алексей1153 Посмотреть сообщение
При многопоточности я обычно использую CString (MFC) или QString (Qt) - они юзают COW . . А ведь ни разу не поломалось, всё чётко, проектов много, потоков в них много. ... Видимо, подсчёт ссылок у них внутри синхронизирован
И в MFC подсчёт ссылок достаточно тормозной.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
02.11.2019, 19:41
Цитата Сообщение от Croessmah Посмотреть сообщение
Книжка не учитывает современные версии C++?
книжка 2001 года.
0
3 / 2 / 1
Регистрация: 02.11.2019
Сообщений: 7
02.11.2019, 19:43
Если сделать вот так
C++
1
{s.at(i)=st.at(i);};
то ошибка проявит себя примерно так:


terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::at: __n (which is 0) >= this->size() (which is 0)


И вообще копировать строки нужно с помощью оператора копирования, для этого они и были придуманы...
C++
1
std::string s = s1;
А класс string сам разберет, что ему нужно для копирования.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
02.11.2019, 19:47
Croessmah, это Мейерс говорит о слухах которые утверждали, что STL не безопасен?, на форуме тут один чел долго помню спорил, у него на аватарке колесо вроде нарисовано или типа того.

Добавлено через 1 минуту
сейчас наверно с стандартной многопоточностью, поправили реализацию?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
02.11.2019, 20:04
_stanislav, у каждого вендора может быть не одна реализация.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
02.11.2019, 20:51
Цитата Сообщение от _stanislav Посмотреть сообщение
это Мейерс говорит о слухах которые утверждали, что STL не безопасен?
До C++11 std::string мог быть реализован с помощью COW, и даже не было требования хранить символы массивом друг за другом.
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
02.11.2019, 21:12
Цитата Сообщение от Croessmah Посмотреть сообщение
До C++11 std::string мог быть реализован с помощью COW, и даже не было требования хранить символы массивом друг за другом.
Вряд ли std::string мог быть реализован как copy-on-write. С неконстантными итераторами и прямым доступом к буферу это был бы жуткий уродец.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
02.11.2019, 21:32
oleg-m1973, мы, вроде, о спецификации, а не о реализации.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
02.11.2019, 21:35
Цитата Сообщение от Croessmah Посмотреть сообщение
oleg-m1973, мы, вроде, о спецификации, а не о реализации.
А что, спецификация разве не определяет реализацию, вернее не ограничивает?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
02.11.2019, 21:42
Лучший ответ Сообщение было отмечено politoto как решение

Решение

oleg-m1973, вот пример с gcc 4.9.1
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
 
int main()
{
    std::string s1 = "ohh";
    std::string s2 = s1;
    std::cout << (void*)s1.data() << " - " << (void*)s2.data() << std::endl;
    s2[0] = 'a';
    std::cout << (void*)s1.data() << " - " << (void*)s2.data() << std::endl;
    std::cout << s1 << " - " << s2 << std::endl;
}
0xb5fd88 - 0xb5fd88
0xb5fd88 - 0xb5fdb8
ohh - ahh
https://wandbox.org/permlink/M4CEVvKZzK7gBEqX
2
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
02.11.2019, 21:52
Цитата Сообщение от pcmax Посмотреть сообщение
скажите пожалуйста , что сейчас находится в s?
Вот, например, не самая свежая реализация

Code
1
2
g++ (Debian 4.7.2-5) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <string>
int main()
{
    std::string
        non_terminated{'\0','1','2',},
        terminated{ "12" },
        empty{ },
        s;
    
 
    std::string
        copy_terminated{ terminated, },
        copy_nonterminated{ non_terminated, },
        s_copy{s};
 
    s = non_terminated;
    non_terminated = copy_terminated;
 
    terminated[0]='\0';
 
    return sizeof s;
}
C++
1
2
g++ -std=c++11 -g string.cxx -o string
gdb string
Разворачиваем скрытый текст и наблюдаем построчно, как конструируются экземпляры std::string, и что с ними происходит при изменениях.

Кликните здесь для просмотра всего текста
Temporary breakpoint 1, main () at string.cxx:5
5
C++
1
non_terminated{'\0','1','2',},
$1 = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x8048a5b "\201\303\355\022"}}
1: terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x0}}
2: non_terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x8048a5b "\201\303\355\022"}}
3: empty = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x48ba00d0 "U\211\345WVS\350", <incomplete sequence \375\224>}}
4: s = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x48be7035 "\203\304\030[Í\213\214\021"}}
6
C++
1
terminated{ "12" },
4: s = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x48be7035 "\203\304\030[Í\213\214\021"}}
3: empty = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x48ba00d0 "U\211\345WVS\350", <incomplete sequence \375\224>}}
2: non_terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a014 ""}}
1: terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x0}}

5: non_terminated.length() = 3
7
C++
1
            empty{ },
5: non_terminated.length() = 3
4: s = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x48be7035 "\203\304\030[Í\213\214\021"}}
3: empty = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x48ba00d0 "U\211\345WVS\350", <incomplete sequence \375\224>}}
2: non_terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a014 ""}}
1: terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a02c "12"}}
8
C++
1
s;
5: non_terminated.length() = 3
4: s = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x48be7035 "\203\304\030[Í\213\214\021"}}
3: empty = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x491e3f60 ""}}
2: non_terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a014 ""}}
1: terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a02c "12"}}
12
C++
1
copy_terminated{ terminated, },
5: non_terminated.length() = 3
4: s = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x491e3f60 ""}}
3: empty = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x491e3f60 ""}}
2: non_terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a014 ""}}
1: terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a02c "12"}}
6: copy_terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0xbffffc8c "\315\375\377\277\335\375\377\277\350\37 5\377\277\070\376\377\277E\376\377\277T\ 376\377\277_\376\377\277m\376\377\277y\3 76\377\277\220\376\377\277\335\376\377\2 77\350\376\377\277"}}
13
C++
1
copy_nonterminated{ non_terminated, },
6: copy_terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a02c "12"}}
5: non_terminated.length() = 3
4: s = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x491e3f60 ""}}
3: empty = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x491e3f60 ""}}
2: non_terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a014 ""}}
1: terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a02c "12"}}
7: copy_nonterminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0xbffffc84 "\266\375\377\277"}}
14
C++
1
s_copy{s};
7: copy_nonterminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a014 ""}}
6: copy_terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a02c "12"}}
5: non_terminated.length() = 3
4: s = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x491e3f60 ""}}
3: empty = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x491e3f60 ""}}
2: non_terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a014 ""}}
1: terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a02c "12"}}
8: s_copy = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x1 <Address 0x1 out of bounds>}}
16
C++
1
s = non_terminated;
8: s_copy = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x491e3f60 ""}}
7: copy_nonterminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a014 ""}}
6: copy_terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a02c "12"}}
5: non_terminated.length() = 3
4: s = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x491e3f60 ""}}
3: empty = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x491e3f60 ""}}
2: non_terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a014 ""}}
1: terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a02c "12"}}
17
C++
1
non_terminated = copy_terminated;
8: s_copy = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x491e3f60 ""}}
7: copy_nonterminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a014 ""}}
6: copy_terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a02c "12"}}
5: non_terminated.length() = 3
4: s = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a014 ""}}
3: empty = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x491e3f60 ""}}
2: non_terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a014 ""}}
1: terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a02c "12"}}
19
C++
1
terminated[0]='\0';
8: s_copy = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x491e3f60 ""}}
7: copy_nonterminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a014 ""}}
6: copy_terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a02c "12"}}
5: non_terminated.length() = 2
4: s = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a014 ""}}
3: empty = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x491e3f60 ""}}
2: non_terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a02c "12"}}
1: terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a02c "12"}}
21
C++
1
return sizeof s;
8: s_copy = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x491e3f60 ""}}
7: copy_nonterminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a014 ""}}
6: copy_terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a02c "12"}}
5: non_terminated.length() = 2
4: s = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a014 ""}}
3: empty = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x491e3f60 ""}}
2: non_terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a02c "12"}}
1: terminated = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804a044 ""}}


p terminated.length()
$2 = 2
p terminated[1]
$3 = (const char &) @0x804a045: 50 '2'
p terminated.data()
$4 = 0x804a044 ""
p terminated.begin()
$5 = {_M_current = 0x804a046 ""}
p terminated.end()
$6 = {_M_current = 0x804a044 ""}
$7 = 2
$8 = 0x804a02c "12"
$9 = 0x804a02c "12"
Continuing.
[Inferior 1 (process 23504) exited with code 04]
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
02.11.2019, 21:54
Цитата Сообщение от Croessmah Посмотреть сообщение
oleg-m1973, вот пример с gcc 4.9.1
Да, не знал. Позже посмотрю, что это было. Но - недолго продержалось - в 5-м уже
C++
1
2
3
0x7ffc47c58ad0 - 0x7ffc47c58ab0
0x7ffc47c58ad0 - 0x7ffc47c58ab0
ohh - ahh
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
02.11.2019, 22:06
Пользователь вправе ожидать корректной и разумной реализации от вендора, но проверить свои предположения никогда не помешает.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
02.11.2019, 22:12
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Позже посмотрю, что это было.
Это был COW. В C++11 требования к std::string поменялись.
В версии 5 gcc поменяли COW на SSO.
https://gcc.gnu.org/gcc-5/changes.html
A new implementation of std::string is enabled by default, using the small string optimization instead of copy-on-write reference counting.
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
02.11.2019, 22:17
Цитата Сообщение от Croessmah Посмотреть сообщение
Это был COW. В C++11 требования к std::string поменялись.
В версии 5 gcc поменяли COW на SSO.
Т.е. это было даже без SSO? Жесть.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
02.11.2019, 22:37
Цитата Сообщение от Croessmah Посмотреть сообщение
SSO
Что значат эти буквы? Копирование при записи понятно, ленивая реализация, а SSO чего такое? И как эти две идиомы связанны?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
02.11.2019, 22:38
Цитата Сообщение от _stanislav Посмотреть сообщение
а SSO чего такое?
small string optimization - если просто, то это когда символы сохраняются непосредственно в объекте string, без выделения динамической памяти.
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
03.11.2019, 08:34  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
но вообще, не могу придумать случая, когда это может помешать. Разве что тот случай, когда аргумент функции имеет именно тип std::vector<char>
вектор на первый взгляд просто убогость.

заявленно, что я могу менять его размерность в ходе программы. менять то можно, только на выходе получаю одни нули.


[CPP]

#include <iostream>
#include <vecktor>



int main(){

std::vecktor<int>vk;

vk.reserve(3);

vk[0]=1;
vk[1]=2;
vk[2]=3;
vk.resize(4);

vk[3]=4;

for(int i=0; i<4; ++i){std::cout << vk[i];
}

чего -то при выводе вектора получаю нули.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.11.2019, 08:34
Помогаю со студенческими работами здесь

что такое std::out
люди, в общем препод нам попался из разряда &quot;пришел унизился ушел&quot; ты ему слово, он тебе в ответ десять вопросов он задал мне банальый...

Что такое std::allocator<T> ?
я так понял возвращает адрес чего то?

std::map что такое и с чем это есть
попытался найти док-ию по map, но так и не нащёл. есть у кого ли нормальная док-ия по Map?

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...

Что означает std::string to_string( int value )?
Что означает: std::string to_string( int value )


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru