«Распад» относится к неявному преобразованию выражения из типа массива в тип указателя. В большинстве случаев, когда компилятор видит выражение массива, он преобразует тип выражения из «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.
Возможности состоят в том, что Вы ничего уже не должны делать при использовании асинхронных методов. В зависимости от технологии, которую Вы используете для вызова для веб-сервиса, в конечном счете, он собирается в выпадающий к API Win32 выполнить вызов для получения байтов от сети, и с этой целью, это будет использовать Порты Завершения ввода-вывода для обработки асинхронных вызовов.
основная предпосылка позади портов завершения ввода-вывода - то, что при ожидании на операциях ввода-вывода, существует пул потоков, который заставлен ждать то, когда операции ввода-вывода завершаются (предположение, что Вы зарегистрировались для использования портов завершения ввода-вывода). Когда Ваша регистровая операция завершается, поток от пула потоков порта завершения ввода-вывода используется для обработки обратного вызова.
, Конечно, после обращения к порту завершения ввода-вывода, Ваш поток может идти дальше, чтобы сделать больше работы, или оконечный, выбор ваше дело.
следующее должно помочь описать это больше:
Порты Завершения ввода-вывода:
http://msdn.microsoft.com/en-us/library/aa365198 (По сравнению с 85) .aspx
В Портах Завершения ввода-вывода (Wayback Machine):