|
VC2015 и VC2010. Файл вырастает в 3,5раза |
|
|
|
Jul 31 2018, 04:57
|

Профессионал
    
Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143

|
Добрый день вот такой вопрос, есть проект для VC2010, на выходе файл 182k тот же самый проект, скомпиленный в VC2015 дает файл 614k посему немного вопросов для тех, кто разбирается в тонкостях линковки: - каким софтом можно узнать, что же так разрослось ? - так как конечный результат хочу выложить в свободный доступ для желающих, то какой вариант выкладывать ? вот эти файлики, если вдруг кому-то проще посмотреть
prj_VC2010_vs_VC2015.ZIP ( 347.36 килобайт )
Кол-во скачиваний: 13
--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
|
|
|
|
|
 |
Ответов
|
Aug 1 2018, 09:41
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(DASM @ Aug 1 2018, 12:27)  определения типов , входящих в эти строки можно? что то додумывать не хочется Код struct OscRaw { uint chainN; //кол-во не-NULL указателей chain uint nv0, ixf0, nvf0; //соответственно chain[0].nv, chain[0].ixf и chain[0].fmt[ixf].n на момент защёлкивания Get() FILETIME timestamp; //временная метка последних принятых данных char timestampOk; //!=0 - timestamp валидно uint oscsrcNV[OSCSRC_n]; //кол-во векторов по каждому источнику осц. непрерывным участком от самого нового вектора до ближайшего разрыва по данному источнику HCOsc *chain[OSC_BRING_N]; //массив блоков данных векторов осц. (каждый имеет заголовок HCOsc) TIPCALL OscRaw() { ZeroMemory(this, sizeof(*this)); } TIPCALL OscRaw(OscRaw const &src) { ZeroMemory(this, sizeof(*this)); *this = src; } TIPCALL ~OscRaw() { Destroy(); } void TIPCALL Get(); void TIPCALL Destroy(); OscRaw & operator =(OscRaw const &); }; struct HCOsc { long volatile use; //кол-во пользователей данного элемента (кол-во link-ов на него) uint volatile nv; //кол-во векторов в данном элементе uint ixf; //индекс последнего записанного элемента fmt (кол-во_записанных_элементов_fmt - 1) struct Format { u64 map; //бит-карта источников осц. для n векторов uint n; //кол-во векторов осц. которые соответствуют карте map uint TIPCALL GetVktOffs(uint) const; } fmt[64]; //список описателей формата векторов в данном элементе HCOsc void TIPCALL Delete() { if (!InterlockedDecrement(&use)) delete this; } }; А приведённый кусок кода - это участок результата компиляции OscRaw::Get(): Код void TIPCALL OscRaw::Get() { HCOsc *p, **pb = &chain[0]; ... if (chainN = n) { nv0 = (p = chain[0])->nv; nvf0 = p->fmt[ixf0 = p->ixf].n; } timestamp = ::timestamp; timestampOk = ::timestampOk; memcpy(oscsrcNV, (void *)&::oscsrcNV[0], sizeof(oscsrcNV)); LeaveCriticalSection(&csb); } Как видите - volatile в данных местах нету. PS: Копирование в промежуточную переменную p = chain[0] это уже я позже добавил. В таком варианте эти лишние чтения указателя уже пропадают. Т.е. - компилятор почему-то сам не догадывается так сделать (сохранить chain[0] в регистре), но если ему явно указать на это, поместив указатель в отдельную переменную (p), то p он уже оптимизирует в регистр. По идее - раз массив chain указан без volatile, то значит не имеет side effects, а значит его члены можно перемещать куда угодно и создавать сколько угодно копий.
|
|
|
|
|
Aug 1 2018, 11:33
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(jcxz @ Aug 1 2018, 12:41)  PS: Копирование в промежуточную переменную p = chain[0] это уже я позже добавил. В таком варианте эти лишние чтения указателя уже пропадают. Т.е. - компилятор почему-то сам не догадывается так сделать (сохранить chain[0] в регистре) Он не может. У вас там присваивания в поля структуры OscRaw (nv0 и nvf0). Для компилятора это запись в память. Видимо анализ указателей у VC хромает (или выключен), и он считает, что эта запись потенциально может попасть в любой глобальный объект (ч том числе и в те, к которым обращаются через указатель). Поэтому содержимое chain может измениться (с точки зрения компилятора). Цитата но если ему явно указать на это, поместив указатель в отдельную переменную (p), то p он уже оптимизирует в регистр. тут вы взяли отвественность на себя, явно переместив значение в локальную переменную. Для неё pointer анализ говорит, что она ни с какими указателями не пересекается. Цитата По идее - раз массив chain указан без volatile, то значит не имеет side effects, а значит его члены можно перемещать куда угодно и создавать сколько угодно копий. Нет. В массив могут записать 'сбоку' (не через указатель на него).
|
|
|
|
Сообщений в этой теме
megajohn VC2015 и VC2010. Файл вырастает в 3,5раза Jul 31 2018, 04:57 Forger Цитата(megajohn @ Jul 31 2018, 07:57) Доб... Jul 31 2018, 07:01 megajohn Кэп, просто человеческое любопытство, не более чем... Jul 31 2018, 07:55  mantech Цитата(megajohn @ Jul 31 2018, 10:55) Кэп... Jul 31 2018, 08:27  jcxz Это "нормально". Компилю сейчас под VS20... Jul 31 2018, 08:28  Forger Цитата(megajohn @ Jul 31 2018, 10:55) Кэп... Jul 31 2018, 09:55   jcxz Цитата(Forger @ Jul 31 2018, 12:55) в нов... Jul 31 2018, 10:15    Forger Цитата(jcxz @ Jul 31 2018, 13:15) И что? ... Jul 31 2018, 10:20     jcxz Цитата(Forger @ Jul 31 2018, 13:20) Это н... Jul 31 2018, 11:27      Forger Цитата(jcxz @ Jul 31 2018, 14:27) Там не ... Jul 31 2018, 11:52       jcxz Цитата(Forger @ Jul 31 2018, 14:52) А пре... Jul 31 2018, 12:07        Forger Цитата(jcxz @ Jul 31 2018, 15:07) На рабо... Jul 31 2018, 12:20         gte Цитата(Forger @ Jul 31 2018, 16:20) Вирту... Jul 31 2018, 12:42          DASM Цитата(gte @ Jul 31 2018, 15:42) Кстати. ... Jul 31 2018, 19:14           jcxz Цитата(DASM @ Jul 31 2018, 22:14) это не ... Aug 1 2018, 08:57 x893 Соберите из консоли с map файлом.
И изучайте. Jul 31 2018, 10:36   jcxz Цитата(XVR @ Aug 1 2018, 14:33) Нет. В ма... Aug 1 2018, 12:12    XVR Цитата(jcxz @ Aug 1 2018, 15:12) Более то... Aug 1 2018, 15:43     jcxz Цитата(XVR @ Aug 1 2018, 18:43) Это не та... Aug 1 2018, 16:03 DASM if (chainN = n) не компилится, это не член OscRaw Aug 1 2018, 10:13 jcxz Цитата(DASM @ Aug 1 2018, 13:13) if (chai... Aug 1 2018, 10:16 DASM где там n? Aug 1 2018, 10:18 jcxz Цитата(DASM @ Aug 1 2018, 13:18) где там ... Aug 1 2018, 10:22 DASM ну а вдруг. Догадаться не могу, тупой я. Aug 1 2018, 10:24 Gate Мне кажется, здесь объяснено поведение компилятора... Aug 1 2018, 15:53 XVR Используйте спецификатор __restrict Aug 1 2018, 15:57 DASM Не не, сливаться не стоит. О restrict точно вспомн... Aug 1 2018, 16:13 jcxz Цитата(DASM @ Aug 1 2018, 19:13) Не не, с... Aug 1 2018, 17:15  XVR Цитата(jcxz @ Aug 1 2018, 20:15) restrict... Aug 2 2018, 06:32
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|