SA-MP Forums Archive
Оптимизация кода - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: Оптимизация кода (/showthread.php?tid=153915)

Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13


Re: Оптимизация кода - [JIeXa] - 16.06.2010

это функция компилятора(так же как if, switch,goto и т.д.), и если массив динамичный то, конечно, установка значения размера будет во время работы сервера


Re: Оптимизация кода - Stepashka - 16.06.2010

Quote:
Originally Posted by Eakwarp [Valakas.ru
]ты правда так думаешь?)
могу доказать!
pawn Code:
public OnPlayerText(playerid,text[])
{
printf("%d",sizeof(text));
return 1;
}
или дальше будем доказывать что компилятор при компелировании знает все размеры массива text, появляющихся при работе сервера?!
Quote:
Originally Posted by [JIeXa
]
это функция компилятора(так же как if, switch,goto и т.д.), и если массив динамичный то, конечно, установка значения размера будет во время работы сервера
вам уважаемый сказки писать надо, советую вам по новой перечитать основы програмирования.


Re: Оптимизация кода - Zeex - 16.06.2010

Quote:
Originally Posted by доки, доки и еще раз доки....
The sizeof operator returns the size of a variable in “elements”. For a
simple (non-compound) variable, the result of sizeof is always 1, because an
element is a cell for a simple variable.

An array with one dimension holds a number of cells and the sizeof operator
returns that number. The snippet below would therefore print “5” at the
display, because the array “msg” holds four characters (each in one cell) plus
a zero-terminator:

Listing: sizeof operator
pawn Code:
new msg[] = "Help"
printf("%d", sizeof msg);
With multi-dimensional arrays, the sizeof operator can return the number
of elements in each dimension. For the last (minor) dimension, an element
will again be a cell, but for the major dimension(s), an element is a sub-array.
In the following code snippet, observe that the syntax sizeof matrix refers
to the major dimension of the two-dimensional array and the syntax sizeof
matrix[] refers to the minor dimension of the array. The values that this
snippet prints are 3 and 2 (for the major and minor dimensions respectively):

Listing: sizeof operator and multidimensional arrays
pawn Code:
new matrix[3][2] = { { 1, 2 }, { 3, 4 }, { 5, 6 } }
printf("%d %d", sizeof matrix, sizeof matrix[]);
The application of the sizeof operator on multi-dimensional arrays is especially
convenient when used as a default value for function arguments.
Quote:
Originally Posted by оттуда же
results in the size in “elements” of the specified variable. For
simple variables and for arrays with a single dimension, an
element is a cell. For multi-dimensional arrays, the result is
the number of array elements in that dimension —append []
to the array name to indicate a lower/more minor dimension.
If the size of a variable is unknown, the result is zero.
When used in a default value for a function argument, the expression
is evaluation at the point of the function call, instead
of in the function definition.
1) Если массив был явно объявлен в скрипте, то его размер известен и не может измениться ==> sizeof вычислится прямо во время компиляции (см. пример из первой цитаты).

2) Если допустим массив передан функции в качестве параметра, то его размер НЕ может быть вычислен (т.к. функции передается всего лишь его адрес) (как в примере с OnPlayerText выше), стало быть его надо указывать явно (например, передавать в качестве дополнительного параметра).

3) Когда sizeof выступает в качестве дефолтного значения одного из аргументов функции (при этом будучи примененным к другому ее аргументу), его значения вычисляетя непосредственно при самом вызове функции (если оно может быть вычислено, см. пункт 2).


Re: Оптимизация кода - Stepashka - 16.06.2010

Zeex, во-первых, это русский форум, пишите на русском. В-вторых, что делает данная функция мы знаем, спор бы о том когда она это делает!
И как я уже доказал выше работает она не в момент компелирования, а в во время работы сервера. Также как и if, switch,goto и т.д.
Единственное что исчезает на уровне компилятора это #define и stock


Re: Оптимизация кода - JesterX - 16.06.2010

Все говорят это цифра, цифра. Во первых это константа

Code:
#define number 100
main()
  printf(""#number" %d ", number-1);
Во вторых, это и правда опция копмилятора, уже он делает из неё константу
Code:
number = 99; // Не катит
sizeof(arr) = 99; // Тоже не катит



Re: Оптимизация кода - MX_Master - 16.06.2010

sizeof вычисляется не на стадии компиляции, а во время выполнения
sizeof это такой же оператор языка как return, switch, if, циклы и другие.
sizeof это не функция
sizeof можно использовать как константу
sizeof это не переменная

Кто не знал, есть еще схожий оператор tagof

stepmex
На стадии компиляции еще много чего существует, чего позднее нет (: кроме того, что ты перечислил


Re: Оптимизация кода - JesterX - 16.06.2010

Кстати, у компилятора есть ещё несколько подобных функций, например tagof. Я не знаю что она делает, пробовал вывести её в разных форматах, но получал либо -INFINITY, либо символ id 1.


Re: Оптимизация кода - Zeex - 16.06.2010

Quote:
Originally Posted by stepmex
Zeex, во-первых, это русский форум
И что? Это официальная документация

Quote:
Originally Posted by stepmex
В-вторых, что делает данная функция мы знаем, спор бы о том когда она это делает!
И как я уже доказал выше работает она не в момент компелирования, а в во время работы сервера. Также как и if, switch,goto и т.д.
Единственное что исчезает на уровне компилятора это #define и stock
Я дописал сообщение, см. выше

Небольшой пруф для пункта 1 из моего предыдущего поста
Данный код:
pawn Code:
new test_array[1000];
sizeof(test_array);
преобразуется в:
pawn Code:
;$lcl test_array fffff060
stack fffff060
zero.pri
addr.alt fffff060
fill fa0
; line 7
break   ; 2c
const.pri 3e8 // это и есть sizeof(test_array); 3e8 - это 1000 в 16-ричной системе



Re: Оптимизация кода - MX_Master - 16.06.2010

Quote:
Originally Posted by JesterX
Кстати, у компилятора есть ещё несколько подобных функций, например tagof. Я не знаю что она делает, пробовал вывести её в разных форматах, но получал либо -INFINITY, либо символ id 1.
tagof возвращает уникальный идентификатор типа переменной, судя по докам

-- поправка --


Re: Оптимизация кода - MX_Master - 16.06.2010

Новый пост, т.к. ваще о другом хочу сказать.

Кто знает и использует оператор char ? Это еще один из способов не транжирить память. Кто юзает, знает о чем я.


Re: Оптимизация кода - Stepashka - 16.06.2010

Quote:
Originally Posted by MX_Master
sizeof это не функция
офф определение с тобой несогласно
Quote:
Функция SizeOf возвращает занимаемый размер (в байтах) переменной (Variable) или типа (Type).

Zeex, sizeof ни когда и не во что не преобразовывается, это функция сервера, а не компилятора.
Если кто-то считает обратное, расскажите принци определения компилятором когда нужно преобразовывать данную функцию в константу, а когда оставлять функцией?


Re: Оптимизация кода - MX_Master - 16.06.2010

stepmex
Только с пеной у рта тут не надо несколько постов твердить (: что "sizeof ни когда и не во что не преобразовывается, это функция сервера, а не компилятора."

Тебе мастер по скриптингу, и ваще по языку PAWN, говорит, что это не функция, а оператор языка.

-- на десерт --

new str[] = "0123456789",
str_copy [ sizeof str ];

str_copy = str;



Re: Оптимизация кода - Zeex - 16.06.2010

Quote:
Originally Posted by stepmex
Quote:
Originally Posted by MX_Master
sizeof это не функция
офф определение с тобой несогласно
Quote:
Функция SizeOf возвращает занимаемый размер (в байтах) переменной (Variable) или типа (Type).

Откуда этот бред? Из википедии что ли?

Quote:
Originally Posted by stepmex
Zeex, sizeof ни когда и не во что не преобразовывается, это функция сервера, а не компилятора.
Скомпилированный в инструкции скрипт уже не доказательство? Могу сначала в amx перегнать, потом в ассемблер, что в принципе ничего не изменит, так будет лучше?

Quote:
Originally Posted by stepmex
Если кто-то считает обратное, расскажите принци определения компилятором когда нужно преобразовывать данную функцию в константу, а когда оставлять функцией?
sizeof это ВСЕГДА константа, ибо размер его операндов ВСЕГДА известен компилятору. А ежели неизвестен (при неверном использовании), павно выплюнет ошибку и откажется компилять. Так что да, всегда.




Re: Оптимизация кода - RAEN - 16.06.2010

МОжет хватит уже об одном и том же говорить несколько страниц...Вы так всю тему зафлудите. Тут все таки ен спор к чему принадлежит та или иная ф-ция...а оптимизация кода. В этом хаосе потом фиг что найдешь...


Re: Оптимизация кода - Fro1sha - 16.06.2010

Quote:
Originally Posted by MX_Master
Новый пост, т.к. ваще о другом хочу сказать.

Кто знает и использует оператор char ? Это еще один из способов не транжирить память. Кто юзает, знает о чем я.
Можно по подробнее про это рассказать? И как вы пользуетесь этим?


Re: Оптимизация кода - MX_Master - 16.06.2010

Quote:
Originally Posted by Fro1sha
Quote:
Originally Posted by MX_Master
Новый пост, т.к. ваще о другом хочу сказать.

Кто знает и использует оператор char ? Это еще один из способов не транжирить память. Кто юзает, знает о чем я.
Можно по подробнее про это рассказать? И как вы пользуетесь этим?
Факты:
Область применения:
Примеры:


Re: Оптимизация кода - Fro1sha - 16.06.2010

Получается только для глобальных переменных это подходит, в локальных так же через new


Re: Оптимизация кода - MX_Master - 16.06.2010

Quote:
Originally Posted by Fro1sha
Получается только для глобальных переменных это подходит, в локальных так же через new
Области для использования stock и new вы уже давно должны знать. Ни для каких новых операторов и функций для вас, эти области не изменятся. Использование stock в примерах выше не несет обязательной смысловой нагрузки. С таким же успехом можно юзать в примерах new.


Re: Оптимизация кода - [JIeXa] - 16.06.2010

char - 1 байт
и тут даже мозг трахать ненада...
в коде: new pp[50 char] создасться 50 байт
а по дефолту создаются типа int
т.е. int = 4 байт, то размер = 200 байт уже...
и всё таки динамические массивы можно делать только в c++!
ибо это операнд компилятора и не более:
int *tmp = new int[50];
выделяется 200 байт, и указатель на первую ячейку - *tmp
а в павно так нельзя

модер:
- наверное, ты все-таки заметил, что мы скриптим не на С++ и не обсуждаем тут как хорошо все-таки на С все кодить
- "и тут даже мозг трахать ненада..." кому это ты говоришь?
Хочешь этим сказать, что мое стройное описание хуже твоей кучи эмоций вкупе с С++ примерами?


Re: Оптимизация кода - Romanius - 16.06.2010

сначало я думал что char эта переменная которая хранит в себе один знак

А теперь почитав посты MX_Master'a я уже думаю переходить на массивы типа
Code:
stock isPlayerLogged [ 500 char ];