Какова основная причина неспособности поместить массивы указателей в небезопасные структуры в C #? - PullRequest
6 голосов
/ 03 мая 2010

Если бы можно было поместить массив указателей на дочерние структуры внутри небезопасных структур в C #, как это можно было бы сделать в C, создание сложных структур данных без издержек, связанных с наличием одного объекта на узел, было бы намного проще и меньше занимало бы время, а также синтаксически чище и гораздо более читабельным.

Существует ли глубокая архитектурная причина, по которой фиксированные массивы внутри небезопасных структур могут состоять только из "типов значений", а не указателей?

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

Digital Mars D элегантно обрабатывает структуры и указатели, и мне не хватает возможности быстро разработать краткие структуры данных; делая ссылки абстрактными в C #, кажется, что большая часть власти была удалена из языка, хотя указатели все еще существуют, по крайней мере, в маркетинговом смысле.

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

Ответы [ 3 ]

4 голосов
/ 03 мая 2010

Одна очень простая причина: у dotNET есть уплотняющий сборщик мусора. Это движет вещи вокруг. Поэтому, даже если бы вы могли создавать подобные массивы, вам бы пришлось закрепить каждый выделенный блок, и вы бы увидели, как система замедлилась до сканирования.

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

Изменить, чтобы ответить на последнюю часть:

Может быть, я ошибаюсь, ожидая, что языки стать более сильным в представлении сложные структуры данных эффективно со временем.

Я думаю, что C # (или любой другой управляемый язык) гораздо мощнее для представления сложные структуры данных (эффективно). Изменяя указатели низкого уровня на ссылки, собираемые мусором.

2 голосов
/ 03 мая 2010

Я просто догадываюсь, но это может иметь отношение к разным размерам указателей для разных целевых платформ. Кажется, что компилятор C # использует размер элементов непосредственно для вычисления индекса (то есть нет поддержки CLR для вычисления индексов буферов фиксированного размера ...)

В любом случае вы можете использовать массив ulong s и навести на него указатели:

unsafe struct s1
{
  public int a;
  public int b;
}

unsafe struct s
{
  public fixed ulong otherStruct[100];
}

unsafe void f() {
  var S = new s();
  var S1 = new s1();
  S.otherStruct[4] = (ulong)&S1;
  var S2 = (s1*)S.otherStruct[4];
}
1 голос
/ 03 мая 2010

Помещение фиксированного массива указателей в структуру быстро сделает его плохим кандидатом для структуры. Рекомендованный предел размера для структуры составляет 16 байт, поэтому в системе x64 вы можете разместить в массиве только два указателя, что довольно бессмысленно.

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

...