размер типа данных, не используя sizeof

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

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

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

Со всеми этими проблемами (доступ к сети по прокси, пропуская полномочия записи для каталогов установки, потребность обновить файлы, которые сам updater использует - только для именования некоторых) я не попробовал бы еще раз кодировать это самостоятельно. Намного лучше, чтобы проверить, делает ли кто-либо из доступных решений все, которое Вам нужно оно к.

19
задан kay 6 June 2012 в 11:27
поделиться

8 ответов

На мой взгляд, это подпадает под категорию «как добавить два int без использования ++, + = или +? ". Это пустая трата времени. Вы можете попытаться избежать монстров неопределенного поведения, сделав что-то вроде этого.

size_t size = (size_t)(1 + ((X*)0));

Обратите внимание, что я не объявляю переменную типа или указатель на X .

43
ответ дан 30 November 2019 в 01:54
поделиться

Посмотрите исходники компилятора. Вы получите:

  • размер стандартных типов данных.
  • правила заполнения структур

и, исходя из этого, ожидаемый размер чего-либо.

Если бы вы могли хотя бы выделить место для переменной, и введите в него некоторое контрольное значение, вы можете изменить его бит за битом и посмотреть, изменится ли значение, но это все равно не даст вам никакой информации о заполнении.

2
ответ дан 30 November 2019 в 01:54
поделиться

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

3
ответ дан 30 November 2019 в 01:54
поделиться

Возможность заполнение предотвращает все надежды без знания правил, используемых для его введения. И это зависит от реализации.

4
ответ дан 30 November 2019 в 01:54
поделиться

Посмотрите, sizeof - это языковое средство для этого. Единственный, так что это единственный переносимый способ добиться этого.

Для некоторых особых случаев вы могли бы сгенерировать непереносимый код, который использовал некоторую другую эвристику для определения размера конкретных объектов [*] (возможно, заставляя их отслеживать свой собственный размер), но вам придется делать все ведение бухгалтерии самостоятельно.

[*] Объекты в очень общем смысле, а не в смысле ООП.

12
ответ дан 30 November 2019 в 01:54
поделиться

Правильный ответ на этот вопрос интервью: «Зачем мне это делать, когда sizeof () делает это за меня, и это единственный переносимый метод?»

5
ответ дан 30 November 2019 в 01:54
поделиться

Ну, я любитель .. но я попробовал эту проблему и получил правильный ответ, не используя sizeof. Надеюсь это поможет.. Я пытаюсь найти размер целого числа.

int *a,*s, v=10;

a=&v;

s=a;

a++;

int intsize=(int)a-(int)s;

printf("%d",intsize);
10
ответ дан 30 November 2019 в 01:54
поделиться

Попробуйте следующее:

int a;
printf("%u\n", (int)(&a+1)-(int)(&a));
3
ответ дан 30 November 2019 в 01:54
поделиться
Другие вопросы по тегам:

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