Размер интервала зависят от компилятора и/или процессора?

Был бы размер целого числа зависеть от компилятора, ОС и процессора?

69
задан sashoalm 28 January 2015 в 12:02
поделиться

5 ответов

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

В конечном итоге, в теории, все в C и C++ зависит от компилятора и только от него. Аппаратное обеспечение/ОС вообще не имеет никакого значения. Компилятор волен реализовать уровень аппаратной абстракции любой толщины и эмулировать абсолютно все. Ничто не мешает реализации на C или C++ реализовать тип int любого размера и с любым представлением, лишь бы оно было достаточно большим, чтобы соответствовать минимальным требованиям, указанным в стандарте языка. Практические примеры такого уровня абстракции легко доступны, например, языки программирования, основанные на платформе "виртуальной машины", такие как Java.

Однако языки C и C++ задумывались как высоко эффективные языки. Для достижения максимальной эффективности реализация на C или C++ должна принимать во внимание определенные соображения, вытекающие из базового оборудования. По этой причине имеет большой смысл убедиться, что каждый базовый тип основан на некотором представлении, непосредственно (или почти непосредственно) поддерживаемом аппаратурой. В этом смысле размер базовых типов действительно зависит от аппаратуры.

Другими словами, конкретная реализация языка Си или Си++ для 64-битной аппаратной платформы/ОС совершенно свободно может реализовать int как 71-битный знаковый интегральный тип 1's-complement, занимающий 128 бит памяти, используя остальные 57 бит как биты подстановки, которые всегда необходимы для хранения даты рождения подружки автора компилятора. Эта реализация даже будет иметь определенную практическую ценность: ее можно будет использовать для проведения run-time тестов переносимости программ на C/C++. Но на этом практическая польза этой реализации закончится. Не ожидайте увидеть нечто подобное в "нормальном" компиляторе Си/Си++.

121
ответ дан 24 November 2019 в 13:42
поделиться

Да, это зависит как от процессоров (в частности, ISA, архитектура набора команд, например, x86 и x86-64), так и от компиляторов, включая модель программирования. Например, на 16-битных машинах sizeof (int) составляло 2 байта. 32-битные машины имеют 4 байта для int . Считалось, что int был собственным размером процессора, то есть размером регистра. Однако 32-битные компьютеры были настолько популярны, и огромное количество программного обеспечения было написано для 32-битной модели программирования. Поэтому было бы очень запутанно, если бы 64-битный компьютер имел 8 байтов для int . И в Linux, и в Windows остается 4 байта для int . Но они отличаются размером длинной .

Пожалуйста, обратите внимание на 64-битную модель программирования, например LP64 для большинства * nix и LLP64 для Windows:

Такие различия на самом деле довольно неприятны, когда вы пишете код, который должен работать как в Windows, так и в Linux. .Поэтому я всегда использую int32_t или int64_t , а не long , через stdint.h .

33
ответ дан 24 November 2019 в 13:42
поделиться

WPF не обновляет связанные с командой элементы управления, если у него нет причины. Щелчок по графическому интерфейсу приводит к обновлению WPF, поэтому обновление работает.

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

-121--1581131-

Компилятор производит следующий код C #:

Нет - компилятор производит IL, который затем переводится на C #. Любое сходство с кодом C # является чисто случайным (и не все сгенерированные IL могут быть записаны как C #). Присутствие всех этих «nop» говорит мне, что вы находитесь в режиме «debug». Я бы повторил в режиме «выпуска» - это может иметь большое значение для этих вещей.

Я запустил его в режиме выпуска, используя:

static void Main()
{
    Foo(a: "a", b: "b");
}

Giving:

.method private hidebysig static void Main() cil managed
{
    .entrypoint
    .maxstack 8
    L_0000: ldstr "a"
    L_0005: ldstr "b"
    L_000a: call void ConsoleApplication1.Program::Foo(string, string)
    L_000f: ret 
}

So идентично.

-121--2220063-

Да, я обнаружил, что размер int в turbo C был 2 байта, где, как и в компиляторе MSVC, был 4 байта.

В основном размер int - это размер регистров процессора.

-5
ответ дан 24 November 2019 в 13:42
поделиться

Да, было бы. Они имели в виду «от чего это будет зависеть: от компилятора или процессора»? В этом случае ответ будет «и то и другое». Обычно int не больше регистра процессора (если он не меньше 16 бит), но может быть меньше (например, 32-битный компилятор, работающий на 64-битном процессоре). Однако, как правило, для запуска кода с 64-разрядным int требуется 64-разрядный процессор.

7
ответ дан 24 November 2019 в 13:42
поделиться

Типы данных Размер зависит от процессора, поскольку компилятор хочет упростить процессору доступ к следующему байту. например: если процессор 32-битный, компилятор не может выбрать размер int как 2 байта [который он должен был выбрать 4 байта], потому что доступ к другим 2 байтам этого int (4 байта) потребует дополнительного цикла ЦП, который является бесполезным. Если компилятор выбирает int как 4 байта, ЦП может получить доступ к полным 4 байтам за один раз, что ускоряет работу вашего приложения.

Спасибо

0
ответ дан 24 November 2019 в 13:42
поделиться