Как.NET использует Потоки IO или Порты Завершения IO?

«Распад» относится к неявному преобразованию выражения из типа массива в тип указателя. В большинстве случаев, когда компилятор видит выражение массива, он преобразует тип выражения из «N-element array of T» в «указатель на T» и устанавливает значение выражения в адрес первого элемента массива , Исключениями этого правила являются когда массив является операндом либо операторов sizeof, либо &, либо массив является строковым литералом, который используется в качестве инициализатора в объявлении.

Предположим, что следующий код:

char a[80];
strcpy(a, "This is a test");

Выражение a имеет тип «80-элементный массив символов», а выражение «This is a test» имеет тип «16-элементный массив char» (в C; в C ++ строковые литералы - это массивы const char). Однако в вызове strcpy() ни одно из выражений не является операндом sizeof или &, поэтому их типы неявно преобразуются в «указатель на символ», а их значения устанавливаются на адрес первого элемента в каждый. То, что strcpy() получает, - это не массивы, а указатели, как показано в его прототипе:

char *strcpy(char *dest, const char *src);

Это не то же самое, что указатель массива. Например:

char a[80];
char *ptr_to_first_element = a;
char (*ptr_to_array)[80] = &a;

Оба ptr_to_first_element и ptr_to_array имеют одинаковое значение ; базовый адрес. Тем не менее, они являются разными типами и обрабатываются по-разному, как показано ниже:

a[i] == ptr_to_first_element[i] == (*ptr_to_array)[i] != *ptr_to_array[i] != ptr_to_array[i]

Помните, что выражение a[i] интерпретируется как *(a+i) (которое работает только, если тип массива преобразуется в тип указателя), поэтому оба a[i] и ptr_to_first_element[i] работают одинаково. Выражение (*ptr_to_array)[i] интерпретируется как *(*a+i). Выражения *ptr_to_array[i] и ptr_to_array[i] могут приводить к предупреждениям или ошибкам компилятора в зависимости от контекста; они обязательно сделают неправильную вещь, если вы ожидаете, что они оценят a[i].

sizeof a == sizeof *ptr_to_array == 80

Опять же, когда массив является операндом sizeof, он не преобразуется в указатель тип.

sizeof *ptr_to_first_element == sizeof (char) == 1
sizeof ptr_to_first_element == sizeof (char *) == whatever the pointer size
                                                  is on your platform

ptr_to_first_element - простой указатель на char.

31
задан James Alexander 12 February 2009 в 03:48
поделиться

1 ответ

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

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

, Конечно, после обращения к порту завершения ввода-вывода, Ваш поток может идти дальше, чтобы сделать больше работы, или оконечный, выбор ваше дело.

следующее должно помочь описать это больше:

Порты Завершения ввода-вывода:

http://msdn.microsoft.com/en-us/library/aa365198 (По сравнению с 85) .aspx

В Портах Завершения ввода-вывода (Wayback Machine):

https://web.archive.org/web/20101101112358/http://doc.sch130.nsc.ru/www.sysinternals.com/ntw2k/info/comport.shtml

26
ответ дан 27 November 2019 в 22:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: