std::string - всегда наивно считал оберткой вокруг С-шных строк - рад что был не прав. Можно писать на них. 1. Бока есть какие хитрые с ними? 2. И не маловажный вопрос - библиотека для работы с DBF есть какая-нить или придется ручками писать?
Без CRT не хочет линковаться, а CRT в придачу очень не хочу - требует: Код (Text): unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ) unresolved external symbol "public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ) unresolved external symbol _memcpy_s unresolved external symbol _memmove_s unresolved external symbol "public: virtual char const * __thiscall std::exception::what(void)const " (?what@exception@std@@UBEPBDXZ) unresolved external symbol "public: virtual __thiscall std::exception::~exception(void)" (??1exception@std@@UAE@XZ) unresolved external symbol "public: __thiscall std::exception::exception(char const * const &)" (??0exception@std@@QAE@ABQBD@Z) unresolved external symbol "public: __thiscall std::exception::exception(class std::exception const &)" (??0exception@std@@QAE@ABV01@@Z) unresolved external symbol "const type_info::`vftable'" (??_7type_info@@6B@) Xran Xlen memcpy_s memmove_s надо я так понимаю писать свои - может у кого готовые есть? exception - не знаю что ему нужно vftable - тоже не понятно
sivsoft C++ - это обертка вокруг C. MFC, .NET Пишите без C. На ассемблере. А лучше - сразу в хекс-кодах. Клерк вам тут подскажет что к чему. Только пока что не уверен, какой у него сейчас ник.
_DEN_ А разве у вас не вызывают эти CRT и прочие костыли блевотные спазмы ? Клерку чистый код нравится. Асм это наше всё
Booster Какие пределы и эксепшены, если граница выделенной (доступной для чтения) памяти всегда кратна 4-м байтам?! Поэтому достаточно проверить только выравненность исходного указателя, и если он не кратен 4-м, то проверить начало побайтово, а затем перейти на дворды. PS: Соотв-но, если при копировании строки оба указателя src и dest выравнены на 4, то можно сразу копировать строку двордами, определяя ее конец "по ходу дела"
kejcerfcrv Эмоции у меня вызывает не код, а выписка моего банковского счета. И чем меньшими усилиями досигается одна и та же сумма, тем больше у меня эмоций. А холивар CRT vs ТолькоМолодостьТолькоАссемблер - это детсадовские развлечения.
sivsoft Длину буфера под строку всегда выравнивайте на 4 байта. Тогда не только копирование, но и сравнение можно произвести используя инструкции: MOVSD, CMPSD. Например, есть строка: "Шмулик". Её длина 7 байт (6 на текст и 1 на нулевой терминатор). Делаем буфер в 8 байт. Копируем 6 символов туда и далее до конца буфера - нули. Кроме того, зачем вам strlen() - если можно хранить длину строки рядом с буфером. Длину буфера тожно можно хранить рядом, чтобе не тратить время на её вычисления при копировании или сравнении. К примеру вот такая структура может хранить всё это: Код (Text): typedef struct tag_STRPAS { UINT m_StrLen; UINT m_StrBufLen; UINT m_StrBufMaxLen; CHAR m_Text [4]; } STRPAS;
AsmGuru62, в оригинале ещё счётчик ссылок есть с особым состоянием "константа". Если задача про строковые массивы с кучей одинаковых строк, память экономится существенно. Только копирование при записи самому ручками реализовывать может быть сильно лениво. PS А в общем и целом все операции со строками нижнего уровня можно из исходников RTL содрать, они наполовину на ассемблере, а на другую половину - довольно простые.
kejcerfcrv Не совсем. Моя цель - доехать из точки А в точку Б как можно быстрее, а не меряться, у кого выше протектор на покрышках.
А можно немного разъяснить этот момент? Допустим исходный указатель выравнен по границе 4 байт, длина строки 13 байт, разве мы не пропустим конец строки, если будем работать с двордами?
Sholar Если тупить, то можно и пропустить При работе с двордами юзаются преобразования, позволяющие определить есть ли в данном дворде хоть один нулевой байт или нет - если нет, то продолжаем работать двордами, если есть, то - стоп с переходом на байты. И насчет критики "хода конем" с "просвечиванием через 4 битовые маски" Каспер не прав, т.к. тут тоже все зависит от хитрости или тупости реализации этого "просвечивания". Например, стандартная реализация if (((eax+0x7EFEFEFF) ^ ~eax) & 0x81010100), используемая в strlen ntdll и msvcrt, работает достаточно шустро. Ну и ес-но, т.к. побайтового анализа в конце строки "избежать нельзя", то чем длинее строка, тем больше выигрыш от ее прохода двордами.