Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2013, 23:55   #1
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию long double: он какой-то не такой ...

Здравствуйте.
Решил поближе познакомиться с этим типом и слегка удивился:
1. Почему 12 байт (у меня, у кого-то может и по-другому)? По идее правильный размер это 16 байт.
2. Вытекает из первого - раз размер не правильный, значит нет выравнивания. Это легко проверить:
Код:
#include <cstdint>
#include <iostream>

using namespace std;


int main()
{
    while(true)
    {
        long double *p = new long double;
        if( (uintptr_t)p % sizeof(long double) )
            break;
    }
    
    cout << "long double is not aligned !!!\n";
    return 0;
}
В общем удивлен, думал что размеры фундаментальных типов должны расти умножением на два (1, 2, 4, 8, 16). Как в это ряд попало 12 - не понимаю.
220Volt вне форума Ответить с цитированием
Старый 21.12.2013, 23:59   #2
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Цитата:
Сообщение от 220Volt Посмотреть сообщение
..В общем удивлен, думал что размеры фундаментальных типов должны расти умножением на два (1, 2, 4, 8, 16). .
Наверное, это относится только к целым типам.
type_Oleg вне форума Ответить с цитированием
Старый 22.12.2013, 00:30   #3
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Муть какая-то ...
Код:
#include <iostream>

using namespace std;


int main()
{
    cout << "align of long double = " << alignof(long double) <<" \n";
    cout << "align of double = " << alignof(double) <<" \n";
    
    return 0;
}

// Output:
// align of long double = 4
// align of double = 8
У меня чувство что long double довольно хорошо тормозит.
220Volt вне форума Ответить с цитированием
Старый 22.12.2013, 00:33   #4
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Цитата:
Сообщение от type_Oleg Посмотреть сообщение
Наверное, это относится только к целым типам.
Имхо: если бы было так, то у double'а (обычного) не было бы выравнивания 8.
220Volt вне форума Ответить с цитированием
Старый 22.12.2013, 01:20   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
1, 2, 4, 8, 16. Как в это ряд попало 12 - не понимаю.
Сколько не всмаривался, так и не смог понять.
1,2,4,8,16,32,64,128,256,512,1024
Где 12?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 22.12.2013, 01:25   #6
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Сколько не всмаривался, так и не смог понять.
1,2,4,8,16,32,64,128,256,512,1024
Где 12?
Все правильно, вы не туда смотрите ))
Код:
#include <iostream>

using namespace std;


int main()
{
    cout << "size of long double = " << sizeof(long double); 
    
    return 0;
}

// Output:
// size of long double = 12
220Volt вне форума Ответить с цитированием
Старый 22.12.2013, 02:56   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

зависит от компилятора,
Long double не может быть 16 точно, так как не припомню такого типа у FPU, есть extended-тип, 10 байт.
думаю это он выравненный на границу 4 байт.

у меня в студии такого типа при настройках проекта по умолчанию его нет, идет обычный double=8 байт.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Тип Long Double. (язак Си) ivan1492 Помощь студентам 4 08.05.2013 03:40
Маленькая мантисса long double Teodor Общие вопросы C/C++ 2 04.02.2013 14:33
Отличие double и long double в Вижиал cover Общие вопросы C/C++ 1 14.10.2012 13:53
Long double. Максимальная точность. juzam Общие вопросы C/C++ 2 05.10.2010 14:48
long double vs. double VoidMan Общие вопросы C/C++ 1 21.09.2009 18:45