Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проблемы компилятора Microsoft


Автор: ecspertiza 19.5.2010, 20:44
Гуру программеры, объясните мне пожалуйста мне кажется или Microsoft плевала на стандарты?

Есть два компилятора MinGW на базе gcc 4.4.1 и Visual Studio 2008

есть структура данных (это к примеру)

Код

struct s
{
    int i;
    char *q;
    int j;
};


если компилить под MinGW то ф-ция sizeof(s) вернет 16 ,а если скомпилить под студией то почему то 56, это с чего так вдруг?  

Автор: GoldFinch 19.5.2010, 20:57
ecspertiza, я тоже хотел бы знать где вы там взяли 56

алсо о каких стандартах речь? в стандарте языка не определено выравнивание

Автор: ecspertiza 19.5.2010, 21:15
Я структуру привел просто для примера, холивар тоже разводить не хочу, просто интересно с какой стати?

вот точный код который выводит так инфу

Код

#include <iostream>
#include <time.h>

struct bus_info {
        bus_info() {
                num = 0;
                in = out = 0;
        }
        int num;
        std::string punkt;
        time_t out;
        time_t in;
};

int main(int argc, char *argv[])
{
    std::cout << "size " << sizeof(bus_info) << std::endl;

    return 0;
}


получается что C++ от мелкомягких отличается от общечеловеческого?

Автор: djamshud 19.5.2010, 21:21
ecspertiza, получается, что в гцц и мсцпп стлевская строка по-разному реализована.

Добавлено через 1 минуту и 8 секунд
>получается что C++ от мелкомягких отличается от общечеловеческого?

Общечеловеческий - это который аж на одном проценте десктопов? :)

Автор: ecspertiza 19.5.2010, 21:38
Цитата(djamshud @  19.5.2010,  21:21 Найти цитируемый пост)
Общечеловеческий - это который аж на одном проценте десктопов? smile 


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

Автор: djamshud 19.5.2010, 21:40
ecspertiza, это ну никак не про гцц. А вот интеловский компилятор стандартам следует весьма строго.

Автор: GoldFinch 19.5.2010, 21:43
ecspertiza, 
видимо у вас настроки "Debug".
в этом случае в string включаются дополнительные отладочные члены.

возможно msvc также выделяет место для коротких строк (не уверен)

Добавлено через 1 минуту и 3 секунды
в любом случае, стандарт ничего не говорит про размер string

Автор: ecspertiza 19.5.2010, 21:57
Цитата(GoldFinch @  19.5.2010,  21:43 Найти цитируемый пост)
ecspertiza, 
видимо у вас настроки "Debug".
в этом случае в string включаются дополнительные отладочные члены.


Да действительно в релиз версии, размер структуры 48.


Цитата(djamshud @  19.5.2010,  21:40 Найти цитируемый пост)
ecspertiza, это ну никак не про гцц. А вот интеловский компилятор стандартам следует весьма строго. 


Ну у меня с ним никогда проблем не возникало. А интеловский компилятор под разные платформы? и интересует как он завется.

Автор: djamshud 19.5.2010, 22:02
Когда пишешь на одном компиляторе, никогда проблем не возникает. Я свой софт под вендой тоже гцц собираю, потому что вижуал студия его не переварит. И не потому, что она плохая, а потому что, что она, что гцц имеют собственное представление о с++, кроме того екстеншены опять же.

http://software.intel.com/en-us/intel-compilers/

Автор: ecspertiza 19.5.2010, 22:16
Жаль что на переносимость расчитывать не приходится, в любом случае спасибо за разъяснение.

Автор: GoldFinch 19.5.2010, 22:24
используя intel compiler,  надо учитывать что он генерит плохой код для AMD

Автор: djamshud 19.5.2010, 22:32
GoldFinch, ага. Я его привел в качестве примера очень педантичного компилятора. Еще он очень медленный, и как показали недавние исследования у gcc выигрывал немного только в паре тестов, в остальном - примерно на равных.

Автор: boostcoder 19.5.2010, 22:49
вставлю своих пять копеек: sizeof(std::string) никак не обязан быть как-то стандартным значением.
а вообще, применять sizeof() можно не ко всем типам...далеко не ко всем.

Автор: djamshud 19.5.2010, 22:51
boostcoder, можно пример типа, к которму низя применить sizeof?

Автор: GoldFinch 19.5.2010, 22:53
djamshud, 
Код

A* p = new B();
sizeof(*p);

Автор: djamshud 19.5.2010, 22:59
GoldFinch, *p в данном случае не тип, и понятно, что компилятор даст размер типа А.

Автор: SVN74 19.5.2010, 23:02
в Turbo C++ тоже 56 байт...
сам std::string = 40 байт

Автор: boostcoder 19.5.2010, 23:04
Цитата(djamshud @  19.5.2010,  22:51 Найти цитируемый пост)
можно пример типа, к которму низя применить sizeof? 

не нужно придираться к словам.
в строчке выше, описанной, что я имел ввиду.

Автор: djamshud 19.5.2010, 23:07
boostcoder, на практике такие строчки пишут только идиоты.

Добавлено @ 23:11
>а вообще, применять sizeof() можно не ко всем типам...далеко не ко всем.

То есть, если в вас вселился кэп, и вы хотели сказать "sizeof можно применять далеко не ко всякой неведомой ...", то да. Я же честно интересовался, к какому типу низя ее применить.

Автор: boostcoder 19.5.2010, 23:37
Цитата(djamshud @  19.5.2010,  23:07 Найти цитируемый пост)
То есть, если в вас вселился кэп, и вы хотели сказать "sizeof можно применять далеко не ко всякой неведомой ...", то да. Я же честно интересовался, к какому типу низя ее применить.

вы хам.

Автор: GoldFinch 20.5.2010, 00:01
djamshud, sizeof применяется не толко к типам, но и к выражениям.
но чтобы вас успокоить, я напишу
Код

A* p = new B();
sizeof(typeof(*p)); 
// или sizeof(decltype(*p));
// или sizeof(BOOST_TYPEOF(*p));

Автор: djamshud 20.5.2010, 00:21
GoldFinch, меня не надо успокаивать, я расслаблен и не напряжен. И я знаю, к чему применяется sizeof. Но он дает результат о размере типа, а не о размере объекта, потому что обрабатывается на момент компиляции, а typeof(*p)==A. Впрочем ты это и так прекрасно понимаешь, не вижу смысла толочь воду в ступе. И если же кто-то таким образом сообразил получить информацию о размере объекта в рантайме, он клинический идиот.

Автор: Earnest 20.5.2010, 07:46
Г-да программеры, сбавьте тон, пока не началось... Эк на вас в ночи накатило  smile 
Все хорошо, sizeof нормальный оператор, применяйте на здоровье. Даже если глупость какую напишите, никто особо не пострадает.
 smile 

Автор: GoldFinch 20.5.2010, 09:27
Цитата(djamshud @  20.5.2010,  01:21 Найти цитируемый пост)
И если же кто-то таким образом сообразил получить информацию о размере объекта в рантайме, он клинический идиот. 

а все потому, что 
Цитата(boostcoder @  19.5.2010,  23:49 Найти цитируемый пост)
применять sizeof() можно не ко всем типам...далеко не ко всем.


Автор: ecspertiza 20.5.2010, 10:28
Нужно закрывать тему, а то еще подеретесь smile

Автор: djamshud 20.5.2010, 11:27
GoldFinch, ты тролль. И мне плевать на твою аллергию. Еще раз
>применять sizeof() можно не ко всем типам...далеко не ко всем.
никак не связано с истинной мыслью автора про неведомую ... . Развели блин демагогию.

Автор: xvr 20.5.2010, 11:55
Какое отношение имеет применимость sizeof от чего бы то не было к теме топика (напоминаю - 'Проблемы компилятора Microsoft')?


M
xvr
Щас разберусь как следует и накажу кого попало  :-D


Автор: azesmcar 20.5.2010, 12:03
ecspertiza

Один и тот же C++ код не должен работать одинаково на разных платформах и компиляторах, для этого в стандарте есть оговорка - implementation defined, т.е. зависит от реализации, размер int -а зависит от реализации, если нужно именно 32-х битное число то можно использовать скажем boost::int32_t, либо определять свой тип. Также со всем остальным, писать переносимый код не так-то просто.

У компилятора микрософт (и не только у него) конечно же есть проблемы, но это не одна из них.

Автор: ecspertiza 20.5.2010, 12:53
Спасибо еще раз, за разъяснение, то есть я теперь уже так понимаю, что к изучению C++ нужно подходить примерно так, сначала изучать какие то фишки общие для всех компиляторов, а потом уже особенности тех компиляторов которые собираешься использовать (и стараться не ругаться в этот момент) smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)