Показать C ++ struct [duplicate]

Интересно, что ни один из ответов на этой странице не упоминает два крайних случая, надеюсь, никто не возражает, если я их добавлю:

Случай с краем # 1: одновременный доступ к словарю

Родовые словари в .NET не являются потокобезопасными, а иногда могут бросать NullReference или даже (чаще) a KeyNotFoundException при попытке получить доступ к ключу из двух параллельных потоков. Исключение в этом случае является довольно ошибочным.

Случай с краем # 2: небезопасный код

Если код NullReferenceException задан кодом unsafe, вы можете посмотреть на переменные указателя , и проверьте их на IntPtr.Zero или что-то в этом роде. Это одно и то же («исключение нулевого указателя»), но в небезопасном коде переменные часто переводятся в типы значений / массивы и т. Д., И вы ударяете головой о стену, задаваясь вопросом, как тип значения может исключение.

(Еще одна причина для небезопасного использования небезопасного кода, если вам это нужно)

4
задан Luchian Grigore 21 October 2011 в 06:44
поделиться

3 ответа

Поскольку указатель на struct всегда указывает на его первый член (поскольку структура выложена последовательно).

В C ли указатель на структуру всегда указывает на его первый член?

(C1x §6.7.2.1.13: " Указатель на структурный объект, соответствующим образом преобразованный, указывает на его начальный член ... и наоборот. В качестве объекта структуры может быть неназванное дополнение, но не в его начале. »)

ПРИМЕЧАНИЕ: mange указывает, по праву, что если вы начнете добавлять виртуальные функции к своей структуре, C ++ реализует это, вставив vtable в начале вашей структуры ... что делает мое утверждение (которое верно для C) неверным, когда вы говорите обо всем, что вы могли бы сделать с «структурами» на C ++.

8
ответ дан Community 27 August 2018 в 18:55
поделиться

Потому что они в одном месте. Первый элемент в struct A является struct B, поэтому они фактически находятся в одном и том же месте памяти (после этого b будет помещено что-либо еще в struct A).

Аналогичным образом x - первый бит данных в struct B, поэтому он находится в том же положении, что и struct B.

Очень важно отметить, что это не всегда будет верно. Такие вещи, как виртуальные функции, заставят вещи двигаться. Это верно в этом случае, потому что они простые классы / структуры.

4
ответ дан mange 27 August 2018 в 18:55
поделиться

Если вы стоите на границе своей страны с чашкой кофе в руке, ваши координаты, координаты границы и координаты кофейной чашки будут иметь одинаковое значение на устройстве GPS.

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

3
ответ дан Muhammad Hasan Khan 27 August 2018 в 18:55
поделиться
Другие вопросы по тегам:

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