Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.192] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 389 390 [391] 392 393 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#5851
,
|
|
|
|
Во как. Что ж, напомню. Ты сказал, что не знаешь, зачем хранить строку в сотни МБ в памяти. Я привёл примеры, когда это может понадобится. Всё.
Добавлено Ну так С++ - это не только и даже не столько Windows. С++ строки практически не уступают по скорости Си-строкам - это ж шаблоны, почти всё инлайнится. Ну, например, вот идёт поток текстовых данных - от того же GPRS, например, - и надо их не только распарсить, но и хранить. Не, ну на Си - модуль ядра написать, а обычное приложение для обычного микроконтроллера с линюхом - легче на С++. |
|
Сообщ.
#5852
,
|
|
|
|
Цитата Adil @ Во как. Что ж, напомню. Ты сказал, что не знаешь, зачем хранить строку в сотни МБ в памяти. Я привёл примеры, когда это может понадобится. Всё. Ок, какие проблемы? Храни на здоровье речь тут не об этом. Хоть на терабайт храни. Цитата Adil @ С++ строки практически не уступают по скорости Си-строкам - это ж шаблоны, почти всё инлайнится. Раскатал губу, еще как уступят, при первом же юзаньи сишной функции, в которую тебе нужно будет передать строку для модификации, тебе придется распрощатся с еще несколько сотнями мегабайт памяти, а также копировании всей строки во временный массив. |
|
Сообщ.
#5853
,
|
|
|
|
Цитата KILLER @ Цитата Adil @ Во как. Что ж, напомню. Ты сказал, что не знаешь, зачем хранить строку в сотни МБ в памяти. Я привёл примеры, когда это может понадобится. Всё. Ок, какие проблемы? Храни на здоровье речь тут не об этом. Хоть на терабайт храни. За контекстом не следишь и слов собственных не помнишь ?Цитата Раскатал губу, еще как уступят, при первом же юзаньи сишной функции, в которую тебе нужно будет передать строку для модификации, тебе придется распрощатся с еще несколько сотнями мегабайт памяти, а также копировании всей строки во временный массив. Зачем тебе тогда std::string Добавлено KILLER, в С++, как и в большинстве других языков, класс строки работает не с null-terminated строками. Понимаешь? И не должен этого делать - работа с ними не эффективна и связана с определенными ограничениями(как минимум ты не можешь использовать 0-символ в произвольном месте строки). Более того, т.к. такие строки - это не тип, а соглашение, ты накладываешь ограничение на внутреннее представление объекта класса. Хотя с другой стороны, быть может в стандартной библиотеке имело смысл завести специальный класс для работы с null-terminated строками. Но std::string так вести себя не должен. |
|
Сообщ.
#5854
,
|
|
|
|
Цитата D_KEY @ За контекстом не следишь и слов собственных не помнишь ?Да все я помню. Я не понимаю в чем проблемы? Цитата D_KEY @ Зачем тебе тогда std::string Добавлено Цитата D_KEY @ KILLER, в С++, как и в большинстве других языков, класс строки работает не с null-terminated строками. Понимаешь? И не должен этого делать - работа с ними не эффективна и связана с определенными ограничениями(как минимум ты не можешь использовать 0-символ в произвольном месте строки). Более того, т.к. такие строки - это не тип, а соглашение, ты накладываешь ограничение на внутреннее представление объекта класса. Хотя с другой стороны, быть может в стандартной библиотеке имело смысл завести специальный класс для работы с null-terminated строками. Но std::string так вести себя не должен. У меня никогда не возникало желание, запихнуть бинарный сиквенс в std::string, в вектор пожалуйста. Также я не считаю бинарный сиквенс - строкой. Кстати по ссылке на тему которую я дал, там ты со мной в этом был согласен. Так что мимо. Добавлено Цитата D_KEY @ Хотя с другой стороны, быть может в стандартной библиотеке имело смысл завести специальный класс для работы с null-terminated строками. Но std::string так вести себя не должен. Обоснуй. |
|
Сообщ.
#5855
,
|
|
|
|
Цитата KILLER @ У меня никогда не возникало желание, запихнуть бинарный сиквенс в std::string, в вектор пожалуйста. Также я не считаю бинарный сиквенс - строкой. Кстати по ссылке на тему которую я дал, там ты со мной в этом был согласен. Так что мимо. Был. Согласен. Только это все-равно ограничение. И одно дело, когда ты сам не станешь это делать в большинстве случаев, и совсем другое, когда язык/библиотека тебе это запрещает. Цитата Цитата D_KEY @ Но std::string так вести себя не должен. Обоснуй. null-terminated строки не дают никаких преимуществ при работе со строками, как со строками И ни в одном языке классы/встроенные типы строк так себя не ведут.Это не тип. Это соглашение, которому следует С, и которое иногда может быть удобным. Не более того. Для стандартных операций со строками никакого профита от их использования нет. Одни недостатки - ограничение из-за соглашения, отсутствие информации о длине, возможные ошибки при работе. Так же, обычный оператор индексирования может обрезать строку. Просто замечательно И главное не понятно - зачем тебе null-terminated строки? |
|
Сообщ.
#5856
,
|
|
|
|
Цитата D_KEY @ Был. Согласен. Только это все-равно ограничение. И одно дело, когда ты сам не станешь это делать в большинстве случаев, и совсем другое, когда язык/библиотека тебе это запрещает. Для этого есть другие средства. Цитата D_KEY @ null-terminated строки не дают никаких преимуществ при работе со строками, как со строками И ни в одном языке классы/встроенные типы строк так себя не ведут.Так по убожески? Соглсен.Цитата D_KEY @ Это не тип. Это соглашение, которому следует С, и которое иногда может быть удобным. Не более того. Но для обратной совместимости в С++ это соглашению пользуют и особо не паряца. Цитата D_KEY @ Для стандартных операций со строками никакого профита от их использования нет. Например? Цитата D_KEY @ Так же, обычный оператор индексирования может обрезать строку. Просто замечательно Как и зачем? Цитата D_KEY @ И главное не понятно - зачем тебе null-terminated строки? для обратной совместимости с С-строками. |
|
Сообщ.
#5857
,
|
|
|
|
Цитата KILLER @ Цитата D_KEY @ null-terminated строки не дают никаких преимуществ при работе со строками, как со строками И ни в одном языке классы/встроенные типы строк так себя не ведут.Так по убожески? Соглсен.Да, null-terminated строки для задач работы с обычными строками - это действительно по убожески. Цитата Но для обратной совместимости в С++ это соглашению пользуют и особо не паряца. Для совместимости - это одно, а для нового средства - это другое. Цитата Цитата D_KEY @ Для стандартных операций со строками никакого профита от их использования нет. Например? Вот и приведи пример профита Цитата Цитата D_KEY @ Так же, обычный оператор индексирования может обрезать строку. Просто замечательно Как и зачем? ![]() ![]() killer::string s = "Hello"; s[1] = '\0'; Еще весело итераторам. Цитата Цитата D_KEY @ И главное не понятно - зачем тебе null-terminated строки? для обратной совместимости с С-строками. Для этого есть другие средства - обычные массивы, указатели, а так же вектора. |
|
Сообщ.
#5858
,
|
|
|
|
Цитата D_KEY @ Да, null-terminated строки для задач работы с обычными строками - это действительно по убожески. Помойму только вы тут раздуваете из мухи слона. std::string как раз в большинстве реализаций и сделан в виде массива символов оканчивающийся '\0' . А вы предумываете мнимую оптимизированную работу с какимито мега строками. ну вот например: ![]() ![]() #include <iostream> #include <string> int main() { std::string s = "This is simple string for testing std::string functionality"; const char* pStr = &s[0]; std::cout << pStr; return 0; } Знаешь что выведет MSVS2005 ? Хочешь, давай потестим на остальных компиляторах? Где профит? Цитата D_KEY @ Вот и приведи пример профита Обратная совместимость с С-строкой, это и есть профит. Избегаение создание временного массива и т.д. Цитата D_KEY @ Еще весело итераторам. Ну программист наверное отдает отчет своим действиям. Если он хочет так написать - это не должно быть проблеммой std::string класса. Цитата D_KEY @ Для этого есть другие средства - обычные массивы, указатели, а так же вектора. Значит для хранения С-строки, будь добр юзай массивы, векторы и т.д. А вот для представления бинарных данных - std::string , так выходит? |
|
Сообщ.
#5859
,
|
|
|
|
Цитата KILLER @ std::string как раз в большинстве реализаций и сделан в виде массива символов оканчивающийся '\0' Нет. Смотри: ![]() ![]() std::string s("abcdef"); s[1] = '\0'; std::cout << s << std::endl; std::cout << s.size() << ":|"; std::copy(s.begin(), s.end(), std::ostream_iterator<char>(std::cout, "|")); ![]() ![]() a<крокозябра>cdef 6:|a|<крокозябра>|c|d|e|f| Добавлено Цитата KILLER @ ну вот например: ![]() ![]() #include <iostream> #include <string> int main() { std::string s = "This is simple string for testing std::string functionality"; const char* pStr = &s[0]; std::cout << pStr; return 0; } Так ты выводишь c-строку. Выведи s Добавлено Цитата KILLER @ Обратная совместимость с С-строкой, это и есть профит. Для записи? А зачем оно? И почему не взять вектор в этом случае? Цитата Если он хочет так написать - это не должно быть проблеммой std::string класса. Проблема не в желаниях программиста, проблема в логике работы класса. Допустим, что символ приходит тебе извне, ты записываешь некий символ в строку и она ВНЕЗАПНО меняет размер. Весело, правда ?Цитата Конечно.Значит для хранения С-строки, будь добр юзай массивы, векторы и т.д. Цитата А вот для представления бинарных данных - std::string , так выходит? ![]() Нет, для нормальных строк(а не null-terminated) юзай std::string |
|
Сообщ.
#5860
,
|
|
|
|
Цитата D_KEY @ Нет. Смотри: попробуй подебажить. вот эта строчка: ![]() ![]() std::string s("abcdef"); Закинеться в внутрений массив путем вызова memcpy . на MSVS2005 по крайней мере так. |
|
Сообщ.
#5861
,
|
|
|
|
Цитата KILLER @ Цитата D_KEY @ Нет. Смотри: попробуй подебажить. вот эта строчка: ![]() ![]() std::string s("abcdef"); Закинеться в внутрений массив путем вызова memcpy . на MSVS2005 по крайней мере так. И что? Логика работы стандартных С++ строк не зависит от 0-символа. Он обрабатывается точно так же, как и любой другой. |
|
Сообщ.
#5862
,
|
|
|
|
А вот еще:\
![]() ![]() _Myt& __CLR_OR_THIS_CALL append(const _Elem *_Ptr, size_type _Count) { // append [_Ptr, _Ptr + _Count) if (_Inside(_Ptr)) return (append(*this, _Ptr - _Myptr(), _Count)); // substring if (npos - _Mysize <= _Count || _Mysize + _Count < _Mysize) _String_base::_Xlen(); // result too long size_type _Num; if (0 < _Count && _Grow(_Num = _Mysize + _Count)) { // make room and append new stuff _Traits_helper::copy_s<_Traits>(_Myptr() + _Mysize, _Myres - _Mysize, _Ptr, _Count); //! <<<--------------- Смотри. _Eos(_Num); } return (*this); } ... static _Elem *__CLRCALL_OR_CDECL _Copy_s(_Elem *_First1, size_t _Size_in_bytes, const _Elem *_First2, size_t _Count) { // copy [_First1, _First1 + _Count) to [_First2, ...) // _DEBUG_POINTER(_First1); // _DEBUG_POINTER(_First2); _CRT_SECURE_MEMCPY(_First1, _Size_in_bytes, _First2, _Count); <<<--------- Смотри, вызовет memcpy return _First1; } Добавлено Цитата D_KEY @ И что? Логика работы стандартных С++ строк не зависит от 0-символа. Он обрабатывается точно так же, как и любой другой. То, что std::string в большинстве реализаций представляет собой обыкновенный массив, такой же как и вектор, ничуть не лучше и не хуже. |
|
Сообщ.
#5863
,
|
|
|
|
memcpy не имеет никакого отношения к С-строкам.
|
|
Сообщ.
#5864
,
|
|
|
|
Цитата D_KEY @ memcpy не имеет никакого отношения к С-строкам. вектор также не имеет никакого отношения к С-строкам. |
|
Сообщ.
#5865
,
|
|
|
|
Зачем ты эту жесть выложил? Чтобы в теме было побольше страшного кода на С++
? Добавлено Цитата KILLER @ Цитата D_KEY @ memcpy не имеет никакого отношения к С-строкам. вектор также не имеет никакого отношения к С-строкам. Он к ним имеет такое же отношение, как и массив. |