Здравствуйте!
Я программист в индустрии 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
Здравствуйте, 8bit, Вы писали:
8>Здравствуйте, VoidEx, Вы писали:
8>>>просто надо знать как typedef работает. VE>>Это не аргумент. Аргумент то, что при другом способе записи работа typedef становится очевидной
8>Вот не разу это не так. Не юлите.
Я бы вас упрекнул в незнании смысла слова "юлить", но не буду.
8>По вашей логике получается что если человек написал "typedef PCHAR const CPCHAR", 8>то для него будет очевидным что "typedef const PCHAR CPCHAR" тоже самое?
Нет. Для него будет очевидным, что вверху записано "typedef char * const CPCHAR".
При незнании тайпдефа внизу он увидит "typedef const char * CPCHAR" и ошибётся. Соот-но верхний вариант в заблуждение его не введёт.
Это первый, спорный и субъективный аргумент.
А есть второй (тоже субъективный, разумеется):
Я привык читать так, как внизу, хотя ясно, что в достаточно нетривиальных случаях это не прокатит,
но в своё время я изменил способ записи именно поэтому. Потому что неясно почему то слева надо const писать, то справа.
А так всегда справа. И от метода тоже справа.
8>Это не так. Если человек не понимает как работает typedef , то ничего очевидного тут нет, 8>как const не пиши. Это просто совпадение, что в первом варианте ваша точка зрения совпадает 8>с тем как работает typedef
К сожалению нет в близкой досягаемости людей, на которых можно было бы провести опыт, но
текстуальная замена запоминается и понимается почему-то проще, хотя и не верна в общем случае.
Здравствуйте, VoidEx, Вы писали:
VE>Я привык читать так, как внизу
Да, у Страуструпа так и написано: "Некоторые люди читают такие обьявления справа на лево"
Про typedef аргумент не очень, потому что человек должен знать как он работает,
а то получается что человек возможно не делает ошибки в обьявлении типа, не потому
что он понимает как это работает, а потому что он пишет const ровно перед звездочкой.
В итоге получается есть только ваш субьективный аргумент:
"Я привык читать так" супротив моего мнения, что "это не привычно для большинства",
и если код пишется не только для себя, то другим может быть не легко читать такой код.
>Потому что неясно почему то слева надо const писать, то справа.
Почему не ясно?
Цитирую: "Оператор обьявления, который делает указатель константой, — это *const.
Нет оператора обьявления const*, поэтому ключевое слово const слева от * интерпретируется
как часть базового типа."
Здравствуйте, 8bit, Вы писали:
8>Это же в каждом таком месте думать приходится. Что это? Указатель на константный объект или константный указатель? 8>А когда написано "const wchar_t * cstr" то такое читается автоматом.
Причина того, что думать приходится, вовсе не в том, что способ записи объективно хуже, просто последний тебе непривычен. Объективно он наоборот лучше, аргументы тут уже приводили, можешь еще Александреску почитать.
Здравствуйте, 8bit, Вы писали:
>>Потому что неясно почему то слева надо const писать, то справа. 8>Почему не ясно? 8>Цитирую: "Оператор обьявления, который делает указатель константой, — это *const. 8>Нет оператора обьявления const*, поэтому ключевое слово const слева от * интерпретируется 8>как часть базового типа."
Сложно как-то. У меня проще. Слева от const то, что константно. Если слева *, то указатель константен. Если int, то само число.