powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Очень интересны нюанс с оператором switch
25 сообщений из 236, страница 8 из 10
Очень интересны нюанс с оператором switch
    #39984981
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Ну ты же сам ему сказал оптимизировать на скорость, а переходы плохо сочетаются со
спекулятивным выполнением в процессорах.
Я бы использовал
Код: sql
1.
2.
movq $4, %rcx
repne scasb

а дальше хоть по test rcx, rcx , хоть по таблице переходов.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984988
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devrepne scasb

Эта конструкция в современных процессорах существует только для взад совместимости и
тормозит как последний слоупок.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984997
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, есть ещё не менее простой способ:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
xor %rdx,%rdx
xor %rax,%rax
cmp %cl,'\0'
sete %rax
add %rax,rdx
cmp %cl,'f'
sete %rax
add %rax,rdx
cmp %cl,'j'
sete %rax
add %rax,rdx
cmp %cl,'s'
sete %rax
add %rax,rdx
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985112
rdb_dev,

А есть ещё проще и лучше И быстрее И качественнее
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
bool testSwitch
    (
      char   ch,
      int  & count
    )
    noexcept
{
  static const void*Base[] = {&&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t};
    
  Base['\0'] = &&f;  
  Base['f'] = &&f;
  Base['j'] = &&f;
  Base['s'] = &&f;
  goto *Base[ch]; 
f:
  return false;
t:
  static const char * str = "abracadabra";

  bool is = nullptr != strchr((char*)str, ch);
  
  if (is)
        count++;

  return is;
}




Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
testSwitch(char, int&):
  push rbx
  mov rbx, rsi
  movsx esi, dil
  movsx rdi, dil
  mov QWORD PTR testSwitch(char, int&)::Base[rip], OFFSET FLAT:.L2
  mov QWORD PTR testSwitch(char, int&)::Base[rip+816], OFFSET FLAT:.L2
  mov QWORD PTR testSwitch(char, int&)::Base[rip+848], OFFSET FLAT:.L2
  mov QWORD PTR testSwitch(char, int&)::Base[rip+920], OFFSET FLAT:.L2
  jmp [QWORD PTR testSwitch(char, int&)::Base[0+rdi*8]]
.L4:
  mov edi, OFFSET FLAT:.LC0
  call strchr
  mov r8, rax
  xor eax, eax
  test r8, r8
  je .L1
  add DWORD PTR [rbx], 1
  mov eax, 1
.L1:
  pop rbx
  ret
.L2:
  xor eax, eax
  pop rbx
  ret



Ты скажешь, чел, но тут много mov. А я тебе скажу, если тебе надо заполнить таблицу не 256 символами, а юникодом 65535 то MOV будет столько же. Но при этом скорость извлечение 65535 - 1 элемента будет ровна извлечению 1 символа. Что быстро в 65535 раз.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985141
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby

Впечатление у меня такое:
Понятно, что когда-то начиналось с того, что сейчас называют UCS-2.
Потом долепились составные символы и получился UTF-16.
Так как составные символы "практически никому не нужны" и "интерфейс charAt трогать нельзя",
то работа с кодепойнтами прилепилась нашлепкой - "если кому надо, за практическую константу со всем разберутся".

Конечно, скорее всего так и происходило. И не только с Явой, но с QString, WinApi, C# и т.д.

Это как раз то, о чём я и спорю на этом форуме. В развитых языках программирования существует простой способ работы с Unicode в формате utf-16 без учёта составных символов. И для большинства европейских программистов это нормально и правильно. Но когда я начинаю защищать "wchar_t" свидетели секты utf-8 начинают во все стороны извергать религиозный гнев и кричать, что "wchar_t" — это грехопадение, а истинно правильный только utf-8.

При этом сектанты кричат, что Петрав не понимает простейших вещей, что он зашоренный, что там какие-то великие умляуты и декомпозиция без которой вообще жизни нет, что длинна строки не нужна и индексация тоже и т.д. Ярко наблюдаемый религиозный экстаз во всю ширь и высь.

Но сами сектанты программируют на QString, Java и JavaScript — где есть индексация и strlen(). Где тот-же самый "wchar_t". А мне предлагают использовать utf-8 для которого нет API в C++ и отказаться от wchar_t для которого API в C++ есть.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985145
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Java тащит на себе груз обратной совместимости. И UTF-16 и модифицированный UTF-8 - это всё "грехи" этого груза.
Да, ПетрАВ вправе "себе любимому" изготовить библиотеку для UTF-16 или даже для UCS-2. Для его личных целей это будет "норм".
Вот только "А ты не путай свою шерсть с государственной".
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985147
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
Java тащит на себе груз обратной совместимости. И UTF-16 и модифицированный UTF-8 - это всё "грехи" этого груза.
Да, ПетрАВ вправе "себе любимому" изготовить библиотеку для UTF-16 или даже для UCS-2. Для его личных целей это будет "норм".
Вот только "А ты не путай свою шерсть с государственной".

Груз совместимости? Наверное, ты можешь дать ссылку где хотя бы рекомендуется воспринимать "charAt()" как deprecated.

PS: Интересно, почему ты решил, что это аббревиатура и она именно такая? Просто интересно.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985158
rdb_dev,

Вот Она Мощь GCC 10.2 Про которую Я писал. Сам, взял, и сделал goto array pointer

https://godbolt.org/z/zT6nG3

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
#include <cstdlib>
#include <cstring>
#include <stdio.h>
#include <iostream>


using namespace std;

bool testSwitch(int   ch, int  & count) {
    static const char * str = "abracadabra";
  switch (ch)
  {
  default:
    if (nullptr ==strchr((char*)str, ch))
    case '\0':
    case 'q': 
    case 'i': 
    case 'l': 
    case 'x': 
    case '5': 
    case '1':
    case 'H':
    case 'X':
    case 'Z':
    case 'O':
    case 'P':
      return false;
    else
      count++;
    break;
  }
  return true;
}
 




Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
.LC0:
  .string "abracadabra"
testSwitch(int, int&):
  test edi, edi
  je .L5
  lea eax, [rdi-49]
  push rbx
  mov rbx, rsi
  cmp eax, 71
  ja .L3
  jmp [QWORD PTR .L4[0+rax*8]]
.L4:
  .quad .L7
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L7
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L7
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L7
  .quad .L7
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L7
  .quad .L3
  .quad .L7
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L7
  .quad .L3
  .quad .L3
  .quad .L7
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L7
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L7
.L3:
  mov esi, edi
  mov edi, OFFSET FLAT:.LC0
  call strchr
  test rax, rax
  je .L7
  add DWORD PTR [rbx], 1
  mov eax, 1
  pop rbx
  ret
.L7:
  xor eax, eax
  pop rbx
  ret
.L5:
  xor eax, eax
  ret
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985180
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,

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

Вы спрашивали про промышленный код.
Я считаю, что о промышленном коде речь идет всякий раз тогда, когда программист автоматически, не задумываясь тянется к "библиотечному коду", что бы это ни значило.
В этом смысле я сам "промышленный программист", и у меня в целом нет задачи задумываться
об адекватности используемого "библиотечного кода".

Про 16, 8 и прочие строки.
(Как промышленный программист, да ещё и пишущий на бейсике)
Строки для "обычного" программиста это то, что предоставляет либо "стандартная библиотека",
либо конкретная система, в своих кишках имеющая некоторое "стандартное" представление, что такое "строки" в памяти системы и как с ними работать.
Насколько я понимаю, Windows и iOS за строки именно utf-16 считают, а Linux оперирует с utf-8. Поэтому те кто давит за utf-8 просто рассказывает, что вы неудачник, если
программируете для ios или windows. Здесь белые нитки по всему чёрному полю.

Дальше все просто - хотите бесшовно обмениваться с системой "строками", располагайте такой "библиотечной реализацией", которая сможет это сделать без применения дополнительных преобразований.
Иначе такое взаимодействием будет облагаться налогом на преобразование.

С одной стороны, нельзя единственной "библиотечной" реализацией покрыть вообще все
возможные потребности, в контексте которых возникает термин "строки".
С другой, за построение "стандартной строки", при использовании "системных функций" налог все равно платится, если система работает с utf-16 как внутренним представлением в памяти и источником для построения строк является файл, например
(файлы с такой кодировкой практически не используются).
С другой стороны, счастливая жизнь в другой системе заканчивается, когда какой-то враг
подсовывает этой другой системе файл в кодировке, отличной от utf-8.
Очевидно, что такой враг должен быть проклят вместе со своим файлом.

Касательно wchar_t есть мутные моменты - зачем-то он заявлен платформно-зависимым.
Как точно думали об этом те, кто так сделал, не представляю.
Как не представляю, прилетит ли на самом деле какая-нибудь подстава с этой стороны тем, кто на этот тип положился.

В общем, то, что я хотел сказать состоит в том, что, может быть, это большое везение, что c++ так до с их пор и не обзавелся единым и закостенелым представлением о том, что такое строки и как с ними жить.
Конечно, это кустарщина, а не "промышленное программирование", но зато ты предупрежден
о том, что это твое дело, решать - что ты будешь в своих задачах принимать за "строки",
и как с ними обходиться.
Это не делает богом, но даёт возможность обжигать горшки.

Что касается строк с целью "интернационализации", была такая компания ICU, выпускавшая библиотеки, обеспечивающие работу со всеми видами юникодных кодировок.
Сейчас она принадлежит IBM, и уже с маркировкой от IMB выпуск таких библиотек для явы и си продолжается.
Если нужен (любой) юникод - бери используй, грубо насмехаясь над теми, кто этого не
делает (для utf-16, кажется, там именно wchar_t в качестве "символа")

// http://site.icu-project.org/
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985184
Unicode = evil.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
In this article I’ll fill you in on exactly what every working programmer should know. All that stuff about "plain text = ascii = characters are 8 bits" it’s hopelessly wrong.

Some people are under the misconception that Unicode is simply a 16-bit code where each character takes 16 bits and therefore there are 65,536 possible characters.
This is not, actually, correct. It is the single most common myth about Unicode, so if you thought that, don’t feel bad.

Until now, we’ve assumed that a letter maps to some bits which you can store on disk or in memory:
A -> 0100 0001 // 65 (hex:41)

Every platonic letter in every alphabet is assigned a magic number by the Unicode consortium which is written like this: U+0639.  This magic number is called a code point.
The U+ means "Unicode" and the numbers are hexadecimal. U+0639 is the Arabic letter Ain. The English letter A would be U+0041.
You can find them all using the charmap utility on Windows 2000/XP or visiting the Unicode web site. // http://www.unicode.org/

# РАЗНИЦА МЕЖДУ high-endian & low-endian в том, КАК читать слово "Hello"
// так:
00 48 00 65 00 6C 00 6C 00 6F   // high
// или так:
48 00 65 00 6C 00 6C 00 6F 00   // low
// разные CPU имеют разную скорость обработки
в начало каждой Unicode-строки кладутся 2 байта (Unicode Byte Order Mark): FE+FF (hiend) или FF+FE (loend) // http://www.unicode.org/faq/utf_bom.html
if you are swapping your high and low bytes it will look like a FF+FE and the person reading your string will know that they have to swap every other byte.
(НЕТ, не каждой! Not every Unicode string in the wild has a byte order mark at the beginning).
// в utf-8 НЕТ этих индейцев: There are no byte-order/endianness issues, since UTF-8 data is a byte stream.


тынц
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985185
Unicode vs UTF
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
Using UCS-2 (or UCS-4) under Unix would lead to very severe problems. Strings with these encodings can contain as parts of many wide characters bytes like "\0" or "/" which have a special
meaning in filenames and other C library function params. In addition, the majority of UNIX tools expects ASCII files and cannot read 16-bit words as characters without major modifications.
For these reasons, UCS-2 is not a suitable external encoding of Unicode in filenames, text files, environment variables, etc.

The UTF-8 encoding defined in ISO 10646-1:2000 Annex D and also described in RFC 3629 as well as section 3.9 of the Unicode 4.0 standard does not have these problems.
It is clearly the way to go for using Unicode under Unix-style operating systems.

// UTF-8 has the following properties:
1. UCS characters U+0000 to U+007F (ASCII) are encoded simply as bytes 0x00 to 0x7F (ASCII compatibility).
    This means that files and strings which contain only 7-bit ASCII characters have the same encoding under both ASCII and UTF-8.
2. All UCS characters >U+007F are encoded as a sequence of several bytes, each of which has the most significant bit set.
    Therefore, no ASCII byte (0x00-0x7F) can appear as part of any other character.
3. The first byte of a multibyte sequence that represents a non-ASCII character is always in the range 0xC0 to 0xFD and it indicates how many bytes follow for this character.
    All further bytes in a multibyte sequence are in the range 0x80 to 0xBF. This allows easy resynchronization and makes the encoding stateless and robust against missing bytes.
4. All possible 2^31 UCS codes can be encoded.
5. UTF-8 encoded characters may theoretically be up to six bytes long, however 16-bit BMP characters are only up to three bytes long.
6. The sorting order of Bigendian UCS-4 byte strings is preserved.
7. The bytes 0xFE and 0xFF are never used in the UTF-8 encoding (little/big Endian).

// Examples: The Unicode character U+00A9 = 1010 1001 (copyright sign) is encoded in UTF-8 as
    11000010 10101001 = 0xC2 0xA9
// and character U+2260 = 0010 0010 0110 0000 (not equal to) is encoded as:
    11100010 10001001 10100000 = 0xE2 0x89 0xA0

The official name and spelling of this encoding is UTF-8, where UTF stands for UCS Transformation Format.
Please do not write UTF-8 in any documentation text in other ways (such as utf8 or UTF_8), unless of course you refer to a variable name and not the encoding itself.

An important note for developers of UTF-8 decoding routines: For security reasons, a UTF-8 decoder must not accept UTF-8 sequences that are longer than necessary to encode a character.
For example, the character U+000A (line feed) must be accepted from a UTF-8 stream only in the form 0x0A, but not in any of the following five possible overlong forms:
  0xC0 0x8A
  0xE0 0x80 0x8A
  0xF0 0x80 0x80 0x8A
  0xF8 0x80 0x80 0x80 0x8A
  0xFC 0x80 0x80 0x80 0x80 0x8A


wchar_t следует избегать практически во всех случаях (кроме тех, когда происходит взаимодействие с Windows API).
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985186
однако в C++ довольно странное превращение из utf-8 в utf-16, которое всё равно выливается в wchar_t...
https://stackoverflow.com/questions/7153935/how-to-convert-utf-8-stdstring-to-utf-16-stdwstring
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985206
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный, четыре кэшлайна ради четырёх символов? Что-то я не уверен в оптимальности решения.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985209
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
где хотя бы рекомендуется воспринимать "charAt()" как deprecated
А каким боком "тащим груз обратной совместимости" и аннотация @deprecated??? Тем более, что UTF-16 внутри строк это следствие контракта, заявляющего, что charAt() имеет константную сложность, а вовсе не потому, что UTF-16 "лучше" UTF-8.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985227
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
rdb_devrepne scasb
Эта конструкция в современных процессорах существует только для взад совместимости и тормозит как последний слоупок.Глянул задержки, на каждый операнд в памяти они сравнимы с регистровым вращением через флаг переноса. 4 байта * 4 такта = 16 тактов - как один MUL.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985229
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
petrav
где хотя бы рекомендуется воспринимать "charAt()" как deprecated
А каким боком "тащим груз обратной совместимости" и аннотация @deprecated??? Тем более, что UTF-16 внутри строк это следствие контракта, заявляющего, что charAt() имеет константную сложность, а вовсе не потому, что UTF-16 "лучше" UTF-8.

Ну если это груз совместимости, то следовало бы написать в документации: "charAt()" считается устаревшим, не рекомендуется к использованию, вот вам итератор по символам. И так во всех книгах по Яве. Ведь utf-8 это круче, нужно готовить подрастающее поколение. Вот в Qt5 поступили по-взрослому: раз и кодировка по умолчанию utf-8 и это не обсуждается (не настраивается).

Кстати, а не подскажешь итератор по символам в Яве, который даёт доступ к четырёх байтовым символам? Если не сложно пример кода.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985239
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby

Насколько я понимаю, Windows и iOS за строки именно utf-16 считают, а Linux оперирует с utf-8. Поэтому те кто давит за utf-8 просто рассказывает, что вы неудачник, если
программируете для ios или windows. Здесь белые нитки по всему чёрному полю.

Я скажу во первых что - ничего подобного. Наш разговор распался на 2 бранча еще давно. Одна
часть - это интернационализация, сериализация и стандарты текстовых файлов и интернета.

И другая часть - это внутренняя форма представления строк в API вызовах конкретной операционной
системы. И наш технический спор - спор очень многосторонний и многогранный часто переходит
границы этих бранчей. Мы прыгаем то на одну тему то на другую.

Моя идея о том что строка это не массив а Stream<Char> это вообще философская идея от итераторов
и ФП и я ее продолжаю отстаивать как свое видение будущего для всех строковых типов данных
всех языков.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985259
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Не имеет значения, на что распался разговор.
Где switch и где итераторы...

исключительно в плане уточнения - правильно ли я понимаю, что сейчас вы называете итераторами то, что C++ называет итераторами, и не подразумеваете итераторов в java?

То что ты говоришь про итераторы - здорово.
Но поворачивает на несколько страниц назад.
Итератор, вероятно, должен уметь указывать на/возвращать символ.
А символ-то, в конце концов, это кто?

И вообще - сама строка состоит ли из символов или символ извлекается из неё, но неизвестно, из чего она там состоит?

В этом месте в utf-16 мы с разбегу утыкаемся лбом в грабли, брошенные со времен ucs-2
со строгими приговором - не сметь трогать charat.
Что бы вы ни думали там себе про символы - получите в качестве такового именно, что
вернет charat, или пользуйтесь дописанным после default новым интерфейсом.

От дырки во лбу спасают только заговоры - "да никогда в жизни вы своим кодом не упретесь ни в какие композиционный символы, поэтому фактически нигде никакой ваш код не сломается, если вы используете только charAt".

Может и правда оно так. Но в этом месте желательно хотя бы сознательно понимать, что ты для себя автоматически и бессознательно выбираешь.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985262
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
следовало бы
Кому следовало? Что за ...цкая привычка лазить по чужим огородам со своим уставом?
Есть концептуальная вещь: нельзя индексировать строку по "символам". По кодовым точкам можно, но "вам не понравится".
Эта концепция от языка не зависит и создаёт вполне обоснованные преференции для UTF8.
Поскольку зоопарк (даже всего трёх) кодировок - плохо, то UTF-16/-32 должны "сдохнуть". Это тоже концептуально и тоже не зависит от языка программирования.
А вот ваши домыслы про charAt() и java-доки - лучше удерживать при себе.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985270
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
Есть концептуальная вещь: нельзя индексировать строку по "символам".
Не только можно, но, порой, даже нужно, если необходимо построить отношения при пересечении строковых множеств на основе символьного ключа.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985273
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тема достойна пятничного топика. Я подниму завтра. Мы обсуждаем только одну сторону.
Оператор индекса или charAt. Это узко. Мы же не узко-мыслящие? Верно?

Строка это масссив или Stream?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985285
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Строка это масссив или Stream?

Как там в школе учили? Свет — это одновременно и волна, и частица. Дуалистическая теория?

Для простых применений массив. Для, например, сложного морфологического анализа — поток.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985286
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
...
Строка это масссив или Stream?

а по какой причине - не двусвязный список?
Он знает, для всякого символа - есть у конкретного символа предыдущий.

Раз уж ты сказал "итераторы",
в том смысле, в каком их "должно быть достаточно" для построения любого алгоритма, стой на
своем, то за вычетом причуд какой-то конкретной реализации,
разговор сводится к тому, какие алгоритмы на самом деле ломаются и не могут быть или
дорого переписываются при переходе от представлению строки "массивом" к "двусвязному" и
затем "односвязному" списку (здесь в качестве модели stream)

Конкретный выбор кодирующего представления можно и проигнорировать, хотя от него может
приходить какая-то своя степень сумятицы.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985287
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
mayton
...
Строка это масссив или Stream?

а по какой причине - не двусвязный список?
Он знает, для всякого символа - есть у конкретного символа предыдущий.

Раз уж ты сказал "итераторы",
в том смысле, в каком их "должно быть достаточно" для построения любого алгоритма, стой на
своем, то за вычетом причуд какой-то конкретной реализации,
разговор сводится к тому, какие алгоритмы на самом деле ломаются и не могут быть или
дорого переписываются при переходе от представлению строки "массивом" к "двусвязному" и
затем "односвязному" списку (здесь в качестве модели stream)

Конкретный выбор кодирующего представления можно и проигнорировать, хотя от него может
приходить какая-то своя степень сумятицы.

Я думаю что мы начнем с односвязного.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985319
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
нужно, если необходимо построить отношения при пересечении строковых множеств на основе символьного ключа.
Не надо витать в высоких эмпиреях, когда речь идёт о примитивной индексации по элементам фиксированного размера. В языках программирования это, обычно, "массив". А когда (кто-то) работает с юникодом, то это будет массив кодовых точек. Которые, внезапно, ни разу не символы.
...
Рейтинг: 0 / 0
25 сообщений из 236, страница 8 из 10
Форумы / C++ [игнор отключен] [закрыт для гостей] / Очень интересны нюанс с оператором switch
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]