С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/100: Рейтинг темы: голосов - 100, средняя оценка - 4.95
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
.NET 4.x

Сколько весит bool?

12.08.2011, 20:48. Показов 21435. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!
С товарищем по не счастью уже бьемся продолжительный период времени, чтобы понять сколько весит bool.

Вот до какой проверки мы дошли:
Тестирование...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
using System.Runtime.InteropServices;
 
namespace ConsoleApplicationTest
{
    class Program
    {
        struct A
        {
            bool a;
            bool b;
        }
        static void Main(string[] args)
        {
            A a = new A();
            Console.WriteLine(Marshal.SizeOf(a));
            unsafe
            {
                Console.WriteLine(sizeof(A));
                Console.WriteLine(sizeof(A*));
            }
        }
    }
}


Ответ малость вгоняет в ступор: 8, 2, 4 байта.
Кто знает, пожалуйста объясните такой ответ, а также ответьте сколько занимает памяти bool?.

P.S. Ссылку на MSDN не давать, так как я ему не верю!
2
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.08.2011, 20:48
Ответы с готовыми решениями:

Сколько весит .NET 2.0?
Здравствуйте. Нужно узнать, сколько весит NET 2.0. Заранее спасибо.

Сколько весит .NET Framework
Сколько весит .NET Framework 2.0 или 3.5?

Сколько занимает bool
Вопрос тупой, я знаю. Но сколько памяти занимает bool и new bool?

2
 Аватар для Unril
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
12.08.2011, 22:36
Тип bool в действительности занимает 1 байт, но из-за выравнивания в памяти, на 32-битных платформах он будет выравниваться по 4 байта, а на 64-битных -- по 8 байт. Соответственно, внутри структуры A каждое поле выравнивается так, что в сумме всё занимает 8 байт, хотя на самом деле там 2 байта информации. Можно немного подправить размещение объектов в памяти и запихнуть в 8 байт побольше полей:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System;
using System.Runtime.InteropServices;
 
namespace ConsoleApplication1 {
    class Program {
        static void Main( string[] args ) {
            var s = new MyStruct { a1 = true, a2 = false, a3 = true, a4 = true, a5 = false };
            Console.WriteLine( Marshal.SizeOf( s ) ); // Размер структуры будет равен 8 байт.
 
            Console.ReadKey();
        }
 
        #region Nested type: MyStruct
 
        [StructLayoutAttribute( LayoutKind.Explicit )]
        struct MyStruct {
            [FieldOffset( 0 )] public bool a1;
            [FieldOffset( 1 )] public bool a2;
            [FieldOffset( 2 )] public bool a3;
            [FieldOffset( 3 )] public bool a4;
            [FieldOffset( 4 )] public bool a5;
        }
 
        #endregion
    }
}
Если создать массив из bool и подсчитать выделение памяти, то можно увидеть, что 1 элемент занимает 1 байт + 12 байт для инфраструктуры массива.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
 
namespace ConsoleApplication1 {
    class Program {
        static void Main( string[] args ) {
            const int n = 5000;
 
            long memory1 = GC.GetTotalMemory( true );
            var bools = new bool[n];
            long memory2 = GC.GetTotalMemory( true );
            GC.KeepAlive( bools );
            long memoryDelta = memory2 - memory1;
 
            Console.WriteLine( "Памяти израсходвано: " + memoryDelta + " байт." );
            Console.WriteLine( "Памяти на объект: " + (float)memoryDelta/n + " байт." );
            Console.ReadKey();
        }
    }
}
Подробно на эту тему рассказывается тут: Работа со структурами в C#.
5
 Аватар для HIMen
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
14.08.2011, 05:33
Цитата Сообщение от Unril Посмотреть сообщение
на 32-битных платформах он будет выравниваться по 4 байта, а на 64-битных -- по 8 байт
Меняется размер IntPtr, ссылок и указателей.
Остальное струткуры имеют тот же самый размер, и то же самое выравнивание.
Дополнительное выравнивание до 8 будет уже у пользовательских структур.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public struct s1
{
    public bool b; // 4
    public int i; // 4
    // x86 = 8
    // x64 = 8
}
public struct s2
{
    public bool b; // 4
    public int i; // 4
    public string s; // 4/8
    public IntPtr p; // 4/8
    // x86 = 16
    // x64 = 24
}
public struct s3
{
    public bool b; // 4
    public int i1; // 4
    public int i2; // 4
    public string s; // 4/8
    public IntPtr p; // 4/8
    // x86 = 20
    // x64 = 32
}
4
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.08.2011, 05:33
Помогаю со студенческими работами здесь

Как узнать сколько весит изображение?
Собственно сабж

Сколько весит 27 монет, среди которых одна фальшивка?
Монета весит 12 грамм. Ее фальшивая копия – 9 грамм. Сколько весит 27 монет, среди которых одна фальшивка?

Как узнать, сколько "весит" список (List<>) с объектами ?
List&lt;Data&gt; list = new List&lt;Data&gt;(); list.Add(new Data()); list.Add(new Data()); Как мне узнать, сколько этот список занимает...

Узнать, сколько весит папка
Есть 20 папка пользователя, нужно знать сколько они весить, и изменить текст button1.Text и указать сколько весить. При открытие программы...

Почему переменная типа bool весит 1 байт?
Всем доброго времени суток! Не подскажете, почему булеан весит 1 байт если он имеет всего два значения 0 и 1, следовательно он должен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru