Здравствуйте!
Я программист в индустрии casual компьютерных игр. У нас в игровом движке и игровом коде используется std::wstring и
многие ф-ции принимают строки как wstring const &.
Я подумал, что более правильно будет принимать тип wchar_t const * в качестве типов аргументов для тех функций, которые не меняют содержимое (их подавляющее большинство).
Тогда вместо
void A::Find( wstring const & str )
будет
void A::Find( wchar_t const * cstr )
и для вызовов вида a.Find( L"some wide string" ) не будет создаваться лишняя строка.
Что скажете?
Прошу заметить, в наших проектах производительность и соотвествие "Саттеру/Александреску" не являются приоритетными.
Здравствуйте, Serenadio, Вы писали:
S>Здравствуйте! S>Я программист в индустрии casual компьютерных игр. У нас в игровом движке и игровом коде используется std::wstring и S>многие ф-ции принимают строки как wstring const &. S>Я подумал, что более правильно будет принимать тип wchar_t const * в качестве типов аргументов для тех функций, которые не меняют содержимое (их подавляющее большинство). S>Тогда вместо S>
S>void A::Find( wstring const & str )
S>
S>будет S>
S>void A::Find( wchar_t const * cstr )
S>
S>и для вызовов вида a.Find( L"some wide string" ) не будет создаваться лишняя строка. S>Что скажете? S>Прошу заметить, в наших проектах производительность и соотвествие "Саттеру/Александреску" не являются приоритетными.
не вижу смысл всего этого... если производительность не приоритет то создание временного wstring тоже не должно смущать
вопщем не понятна цель изменения всего этого?? ЗАЧЕМ?!! чего хочется достичь? перемешать в кучу интерфейсы в стиле С и С++? усложнить сопровождение кода? внести новых багов?
Z>не вижу смысл всего этого... если производительность не приоритет то создание временного wstring тоже не должно смущать Z>вопщем не понятна цель изменения всего этого?? ЗАЧЕМ?!! чего хочется достичь? перемешать в кучу интерфейсы в стиле С и С++? усложнить сопровождение кода? внести новых багов?
Да, получается что я и сам ответил на свой вопрос. Спасибо!
Здравствуйте, 8bit, Вы писали:
8>Здравствуйте, Serenadio, Вы писали:
S>>Без разницы
8>Как это без разницы?
"wchar_t const * cstr" и "const wchar_t * cstr" действительно одинаковы — указатель на константный объект. чтобы получилсся константный указатель на объект нужно "wchar_t * const cstr"
Здравствуйте, Ovl, Вы писали:
Ovl>"wchar_t const * cstr" и "const wchar_t * cstr" действительно одинаковы — указатель на константный объект. чтобы получилсся константный указатель на объект нужно "wchar_t * const cstr"
Это понятно. А вот чем обусловлен выбор писать "wchar_t const * cstr" не понятно.
Я достаточно много чужого кода видел, такое ну очень редко встречается. Вот и спрашиваю.
Это же в каждом таком месте думать приходится. Что это? Указатель на константный объект или константный указатель?
А когда написано "const wchar_t * cstr" то такое читается автоматом.
ИМХО, если это у человека такая привычка, то лучше переучиться...
Здравствуйте, 8bit, Вы писали:
8>Здравствуйте, Ovl, Вы писали:
Ovl>>"wchar_t const * cstr" и "const wchar_t * cstr" действительно одинаковы — указатель на константный объект. чтобы получилсся константный указатель на объект нужно "wchar_t * const cstr"
8>Это понятно. А вот чем обусловлен выбор писать "wchar_t const * cstr" не понятно. 8>Я достаточно много чужого кода видел, такое ну очень редко встречается. Вот и спрашиваю. 8>Это же в каждом таком месте думать приходится. Что это? Указатель на константный объект или константный указатель? 8>А когда написано "const wchar_t * cstr" то такое читается автоматом. 8>ИМХО, если это у человека такая привычка, то лучше переучиться...
И то и другое читается автоматом
Здравствуйте, 8bit, Вы писали:
8>Здравствуйте, Ovl, Вы писали:
Ovl>>"wchar_t const * cstr" и "const wchar_t * cstr" действительно одинаковы — указатель на константный объект. чтобы получилсся константный указатель на объект нужно "wchar_t * const cstr"
8>Это понятно. А вот чем обусловлен выбор писать "wchar_t const * cstr" не понятно. 8>Я достаточно много чужого кода видел, такое ну очень редко встречается. Вот и спрашиваю. 8>Это же в каждом таком месте думать приходится. Что это? Указатель на константный объект или константный указатель? 8>А когда написано "const wchar_t * cstr" то такое читается автоматом. 8>ИМХО, если это у человека такая привычка, то лучше переучиться...
Как раз таки в записи "const wchar_t * cstr" логика отсутствует. В записи же "wchar_t const * cstr" модификатор const ставится после сущности, которая должна быть константной.
Для примера возьмем wchar_t * * pcstr:
Указатель на указатель на константный символ:
wchar_t const * * pcstr;
Константный указатель на указатель на символ:
wchar_t * * const pcstr;
Константный указатель на константный указатель на символ:
wchar_t * const * const pcstr;
Просто читать надо с конца, тогда все встанет на свои места.
Даже у методов модификатор const ставится в конце.
Вы тоже так пишете ? А-а-а, их становиться все больше !
Тут дело не в логике. Вот так "wchar_t const * cstr" пишет реально очень малое количество людей.
И "const wchar_t * cstr" пролетает и даже глаз не цепляется.
На ваших же примерах с двумя\тремя\указателями\const
глаз так и так зацепиться, и не важно где стоит const, и правильно сделает.
Здравствуйте, 8bit, Вы писали:
8>Здравствуйте, Were, Вы писали:
8>Вы тоже так пишете ? А-а-а, их становиться все больше !
8>Тут дело не в логике. Вот так "wchar_t const * cstr" пишет реально очень малое количество людей. 8>И "const wchar_t * cstr" пролетает и даже глаз не цепляется. 8>На ваших же примерах с двумя\тремя\указателями\const 8>глаз так и так зацепиться, и не важно где стоит const, и правильно сделает.
Честно говоря, раньше я тоже писал "const wchar_t *" и постоянно путался с объявлением нужной мне константности. Как только стал использовать запись "wchar_t const *" все стало на свои места, так как запись логична и не требует тупого запоминания )
Здравствуйте, 8bit, Вы писали:
8>Здравствуйте, Were, Вы писали:
8>Вы тоже так пишете ? А-а-а, их становиться все больше !
8>Тут дело не в логике. Вот так "wchar_t const * cstr" пишет реально очень малое количество людей. 8>И "const wchar_t * cstr" пролетает и даже глаз не цепляется. 8>На ваших же примерах с двумя\тремя\указателями\const 8>глаз так и так зацепиться, и не важно где стоит const, и правильно сделает.
если бы всегда писали справа налево, то мир был бы проще, и не пришлось бы напрягаться каждый раз разбирая длинный wtf
Здравствуйте, Were, Вы писали:
W>Здравствуйте, 8bit, Вы писали:
8>>просто надо знать как typedef работает.
W>Что-то я так и не увидел аргументов в поддержку записи "const char *", кроме "так принято" )
Друзья, это почти холивар. Самое лучшее, если вы одинаково хорошо читаете оба варианта.
Здравствуйте, 8bit, Вы писали:
8>просто надо знать как typedef работает.
Это не аргумент. Аргумент то, что при другом способе записи работа typedef становится очевидной, а значит что-то становится проще.
В любом случае "глаз цепляется" исключительно субъективное. У меня наоборот цепляется за char const *.
П.С. Я разумеется не собираюсь доказывать, что этот стиль лучше, я лишь опровергаю, что он хуже.
Здравствуйте, VoidEx, Вы писали:
8>>просто надо знать как typedef работает. VE>Это не аргумент. Аргумент то, что при другом способе записи работа typedef становится очевидной
Вот не разу это не так. Не юлите.
По вашей логике получается что если человек написал "typedef PCHAR const CPCHAR",
то для него будет очевидным что "typedef const PCHAR CPCHAR" тоже самое?
Это не так. Если человек не понимает как работает typedef , то ничего очевидного тут нет,
как const не пиши. Это просто совпадение, что в первом варианте ваша точка зрения совпадает
с тем как работает typedef