реклама на сайте
подробности

 
 
> VC2015 и VC2010. Файл вырастает в 3,5раза
megajohn
сообщение Jul 31 2018, 04:57
Сообщение #1


Профессионал
*****

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



Добрый день
вот такой вопрос, есть проект для VC2010, на выходе файл 182k
тот же самый проект, скомпиленный в VC2015 дает файл 614k

посему немного вопросов для тех, кто разбирается в тонкостях линковки:
- каким софтом можно узнать, что же так разрослось ?
- так как конечный результат хочу выложить в свободный доступ для желающих, то какой вариант выкладывать ?

вот эти файлики, если вдруг кому-то проще посмотреть
Прикрепленный файл  prj_VC2010_vs_VC2015.ZIP ( 347.36 килобайт ) Кол-во скачиваний: 13


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
DASM
сообщение Aug 1 2018, 09:27
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



определения типов , входящих в эти строки можно? что то додумывать не хочется
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 1 2018, 09:41
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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, а значит его члены можно перемещать куда угодно и создавать сколько угодно копий.
Go to the top of the page
 
+Quote Post
XVR
сообщение Aug 1 2018, 11:33
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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, а значит его члены можно перемещать куда угодно и создавать сколько угодно копий.
Нет. В массив могут записать 'сбоку' (не через указатель на него).
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 23:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.0259 секунд с 7
ELECTRONIX ©2004-2016