Основанные указатели (C++)
Ключевое слово __based
позволяет объявлять указатели на основе указателей (указателей, которые являются смещениями от существующих указателей). Ключевое слово __based
зависит от Корпорации Майкрософт.
Синтаксис
type __based( base ) declarator
Замечания
Указатели на основе адресов указателей являются единственной формой __based
ключевое слово допустимой в 32-разрядных или 64-разрядных компиляциях. В 32-разрядном компиляторе Microsoft C/C++ относительный указатель имеет 32-разрядное смещение от 32-разрядной базы указателя. То же ограничение действует и для 64-разрядных сред, где относительный указатель имеет 64-разрядное смещение от 64-разрядной базы указателя.
Указатели на основе указателей, в частности, используются для постоянных идентификаторов, которые содержат указатели. Связанный список, состоящий из указателей на основе указателей, можно сохранить на диск, а затем перезагрузить в другое место в памяти. При этом все указатели останутся действительными. Например:
// based_pointers1.cpp
// compile with: /c
void *vpBuffer;
struct llist_t {
void __based( vpBuffer ) *vpData;
struct llist_t __based( vpBuffer ) *llNext;
};
Указателю vpBuffer
назначается адрес в памяти, который выделяется на более позднем этапе программы. Связанный список перемещается относительно значения vpBuffer
.
Примечание.
Сохранение идентификаторов, содержащих указатели, также можно выполнить с помощью сопоставленных с памятью файлов.
Когда выполняется разыменовывание относительных указателей, база должна быть либо явно указана, либо неявно известна из объявления.
Для совместимости с предыдущими версиями _based является синонимом, если не указан параметр __based
компилятора /Za (отключить расширения языка).
Пример
В следующем примере демонстрируется изменение относительного указателя путем изменения его базы.
// based_pointers2.cpp
// compile with: /EHsc
#include <iostream>
int a1[] = { 1,2,3 };
int a2[] = { 10,11,12 };
int *pBased;
typedef int __based(pBased) * pBasedPtr;
using namespace std;
int main() {
pBased = &a1[0];
pBasedPtr pb = 0;
cout << *pb << endl;
cout << *(pb+1) << endl;
pBased = &a2[0];
cout << *pb << endl;
cout << *(pb+1) << endl;
}
1
2
10
11
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по