+14
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
#define MAX_MONSTER_ID 600
#define MAX_ITEM_FOR_MONSTER 40
for (int j=0; j < 1000; j++)
{
AllMobItemsDrop[j].MMap = 0;
AllMobItemsDrop[j].MMinLvl = 0;
AllMobItemsDrop[j].MMaxLvl = 0;
AllMobItemsDrop[j].IDropRate = 0;
AllMobItemsDrop[j].IGroup = 0;
AllMobItemsDrop[j].IIndex = 0;
AllMobItemsDrop[j].IMinLvl = 0;
AllMobItemsDrop[j].IMaxLvl = 0;
AllMobItemsDrop[j].ILvlRate = 0;
AllMobItemsDrop[j].IMinOpt = 0;
AllMobItemsDrop[j].IMaxOpt = 0;
AllMobItemsDrop[j].IOptRate = 0;
AllMobItemsDrop[j].ISkill = 0;
AllMobItemsDrop[j].ISkillRate = 0;
AllMobItemsDrop[j].ILuck = 0;
AllMobItemsDrop[j].ILuckRate = 0;
AllMobItemsDrop[j].IMinExc = 0;
AllMobItemsDrop[j].IMaxExc = 0;
AllMobItemsDrop[j].IExcRate = 0;
AllMobItemsDrop[j].IAnc = 0;
AllMobItemsDrop[j].IAncRate = 0;
}
AllMobArrayMaxItem = 0;
for (int i=0; i < MAX_MONSTER_ID; i++)
{
for (int j=0; j < MAX_ITEM_FOR_MONSTER; j++)
{
ItemsDrop[i][j].MMap = 0;
ItemsDrop[i][j].MMinLvl = 0;
ItemsDrop[i][j].MMaxLvl = 0;
ItemsDrop[i][j].IDropRate = 0;
ItemsDrop[i][j].IGroup = 0;
ItemsDrop[i][j].IIndex = 0;
ItemsDrop[i][j].IMinLvl = 0;
ItemsDrop[i][j].IMaxLvl = 0;
ItemsDrop[i][j].ILvlRate = 0;
ItemsDrop[i][j].IMinOpt = 0;
ItemsDrop[i][j].IMaxOpt = 0;
ItemsDrop[i][j].IOptRate = 0;
ItemsDrop[i][j].ISkill = 0;
ItemsDrop[i][j].ISkillRate = 0;
ItemsDrop[i][j].ILuck = 0;
ItemsDrop[i][j].ILuckRate = 0;
ItemsDrop[i][j].IMinExc = 0;
ItemsDrop[i][j].IMaxExc = 0;
ItemsDrop[i][j].IExcRate = 0;
ItemsDrop[i][j].IAnc = 0;
ItemsDrop[i][j].IAncRate = 0;
}
ArrayMaxItem[i] = 0;
}
Рабочий код с одного сервера. Код инициализации класа с заполнением структуры. А ведь это можно было уместить в:
memset(&AllMobItemsDrop, 0, sizeof(AllMobItemsDrop));
memset(&ItemsDrop, 0, sizeofe(ItemsDrop));
Запостил: Killbrum,
31 Января 2013
movaxbx 31.01.2013 19:23 # +1
Killbrum 31.01.2013 19:26 # +1
struct sItemsDrop
{
short MMap; // #1
short MMinLvl; // #2
short MMaxLvl; // #3
short IDropRate; // #4
short IGroup; // #5
short IIndex; // #6
short IMinLvl; // #7
short IMaxLvl; // #8
short ILvlRate; // #9
short IMinOpt; // #10
short IMaxOpt; // #11
short IOptRate; // #12
short ISkill; // #13
short ISkillRate; // #14
short ILuck; // #15
short ILuckRate; // #16
short IMinExc; // #17
short IMaxExc; // #18
short IExcRate; // #19
short IAnc; // #20
short IAncRate; // #21
};
sItemsDrop ItemsDrop[MAX_MONSTER_ID][MAX_ITEM_FOR_MONSTER];
sItemsDrop AllMobItemsDrop[1000];
krypt 31.01.2013 19:40 # 0
bormand 31.01.2013 19:40 # +6
А memset в крестах лучше не юзать. Вот будут там потом какие-нибудь указатели или неPOD'ы, и будет вам море радости от мемсета.
P.S. А вместо дефайнов можно поюзать const int.
defecate-plusplus 31.01.2013 20:27 # +1
если бы мне попалась такая структура, регулярно требующая зануления (даже в методе clear), я бы написал memset в этом методе с комментом beware of ogres dirty hacks!
потому что кресты крестами, а структуру тому же программисту и поддерживать/расширять, который запарится с выявлением всех мест, где же еще надо дописывать строчки = 0 для новых полей
при желании можно всучить ассерт на is_pod, конечно
bormand 31.01.2013 20:32 # +2
> который запарится с выявлением всех мест, где же еще надо дописывать строчки = 0 для новых полей
Вот в этом у жабы и паскаля есть плюс и минус по сравнению с крестами. Плюс - всегда понятно что по дефолту лежит в полях, и не надо всех этих мемсетов и занулений. Минус - оно, конечно же, медленнее.
absolut 31.01.2013 20:35 # +2
defecate-plusplus 31.01.2013 21:17 # +1
есть обстоятельства?
absolut 01.02.2013 15:17 # 0
Вместо
Для
bormand 01.02.2013 15:31 # 0
absolut 01.02.2013 16:51 # 0
bormand 01.02.2013 18:40 # 0
absolut 01.02.2013 20:45 # 0
defecate-plusplus 01.02.2013 15:31 # 0
absolut 01.02.2013 16:47 # 0
defecate-plusplus 01.02.2013 16:50 # +1
и это всё заворачивать в метод
absolut 01.02.2013 16:55 # 0
LispGovno 31.01.2013 22:36 # −1
std::is_trivial и естественно std::is_pod экземпляры классов можно перемещать memmove и memcpy и занулять memset.
А std::is_standard_layout нахер нужен?
defecate-plusplus 31.01.2013 23:51 # +2
по нему можно делать грязные хаки с offsetof так, что это не приведет к UB
и => делать предположения насчет адреса его первого члена относительно адреса самого объекта
LispGovno 01.02.2013 01:28 # 0
можно делать эти предположения, а в
уже нельзя?
defecate-plusplus 01.02.2013 01:51 # +2
defecate-plusplus 01.02.2013 02:00 # +3
trivial означает, что его инициализация тривиальна
ну а pod = trivial + standard layout
LispGovno 01.02.2013 02:10 # 0
defecate-plusplus 01.02.2013 10:05 # +2
c++11 N3242 - 9.2.15
Nonstatic data members of a (non-union) class with the same access control (Clause 11) are allocated so that later members have higher addresses within a class object. The order of allocation of non-static data members with different access control is unspecified (11).
Killbrum 01.02.2013 10:45 # 0
1) инициализация = конструктор класса (как минимум в данном коде).
2) кроме того куска там больше НИЧЕГО не было. Никаких выделений памяти и т.д.
3) сама структура статичная и имеет только 1 экземпляр
4) класс статичный и имеет только 1 экземпляр
5) код рабочий и сдан "в реализ". Но код сильно тормозит и грузит ЦПУ. Суть была оптимизировать код.
6) суть была в том что есть 3 цикла которые, фактически вручную, забивают нулями. Никто не пробовал посчитать тики процессора? Попробуйте сколько тиков на 3 цикла с 3мя временными переменными и сколько на простой мемсет
7) суть была в том что при добавлении данных в стуктуру надо бежать и дописывать вот такое вот зануливание. И так каждый раз.
8) суть была в том что вот эта хрень занимает лист А4 и видя такое в коде начинает хватать кондратий
P.S. жду минусов
bormand 01.02.2013 11:34 # 0
Недождешься. Буду вести конструктивную беседу.
Написал небольшой бенчмарк - двойной цикл до 600 и до 40 и зануление 21 поля на каждой итерации (как в вашем нижнем цикле). И аналогичный бенчмарк для мемтеста того же самого массива. Результаты (10к итераций, gcc 4.6.3, амд 2ГГц) - мемсет 12.3с, циклы 27.3с. Разница всего в два раза.
> 3мя временными переменными
-O2, не, не слышал? Счетчики циклов чуть реже чем всегда попадают в регистры.
Говно тут не в очистке циклами, а архитектуре, из-за которой вообще возникла необходимость часто (если бы это было только при старте - на 2.7мс на довольно хреновом компе всем было бы похуй, и этот код бы тут не оказался) чистить большую структуру фиксированного размера (600х40 элементов).
> суть была в том что вот эта хрень занимает лист А4 и видя такое в коде начинает хватать кондратий
Есть такое. От срани с копипастом ItemsDrop[i][j] и AllMobItemsDrop[j] в каждой строке точно кондратий хватит.
absolut 01.02.2013 11:42 # +1
Когда исходных данных не хватает - другого не остается.
bormand 01.02.2013 11:51 # 0
Тики процессора сейчас неудобно считать, если это конечно не какой-нибудь атмеловский 8-битный контроллер. За счет спекулятивного исполнения и кешей все эти тики превращаются в ничего не значащее говно. Настоящее время исполнения можно оценить только досконально зная архитектуру конкретного проца (никто этого делать не будет, ибо долго и дорого), или прогнав прогу под профайлером.
Ну а вообще - спички-спичечки. Сделаем говно в архитектуре (типа необходимости частой очистки вон того массива 600х40), а потом будем выдрачивать производительность на спичках...
P.S. Под профайлером гоняли?
bormand 01.02.2013 11:56 # 0
Вывод - ни циклы не мемсет не нужны. Вообще.
TarasB 01.02.2013 10:50 # −4
LispGovno 02.02.2013 19:24 # +2
http://en.wikibooks.org/wiki/Ada_Programming/Generics
TarasB 04.02.2013 17:13 # −3
3.14159265 04.02.2013 18:13 # +5
Совсем окрестился! Забудь эту мерзкую выкресть - "шаблоны".
Женерики, они же обобщения.
TarasB 05.02.2013 17:12 # 0
3.14159265 05.02.2013 17:23 # +2
TarasB 05.02.2013 17:31 # 0
Так вот, шаблоны в Аде есть. А крестошаблонов - нет.
3.14159265 05.02.2013 17:36 # +1
В Аде Generics - обобщения.
В С++ Templates - шаблоны.
А так адашаблоны, крестошаблоны, жабошаблоны, шарпошаблоны, хацкишаблоны - воистину КБГМ.
TarasB 05.02.2013 18:12 # 0
LispGovno 04.02.2013 20:54 # +3
3.14159265 04.02.2013 21:01 # +5
Просто не признает этого, опасается гонений.
defecate-plusplus 04.02.2013 21:39 # +8
absolut 04.02.2013 21:47 # +5
bormand 04.02.2013 22:07 # +7