LINUX.ORG.RU

size_t


0

0

Правильно ли я понимаю, что этот тип данных изначально предназначен для размеров (и, возможно, смещений) измеряемых _в байтах_?

Стоит ли использовать его для величин а-ля "количество структур", если заведомо известно, что величина не превысит скажем INT_MAX?

anonymous

А зачем? На 64 битной системе он будет занимать 8 байтов, если достаточно 4, зачем платить больше.

Legioner ★★★★★
()
Ответ на: комментарий от aton

какого регистра? какой перформанс? хочешь сказать что при копировании 32 битного значения в 64 битный регистр теряется производительность? гм... максимум что - размер будет больше из-за префикса комманды.

eXOR ★★★★★
()

стоит, хотя бы потому, что плюсовые контейнеры оперируют именно им как размером; да и сишные стандартные функции тоже.

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

anonymous
()
Ответ на: комментарий от eXOR

> хочешь сказать что при копировании 32 битного значения в 64 битный регистр теряется производительность

Теряется на вычислениях, почувствуй разницу:

 Код int i,j; j = i + j;
 Компильтся в следующее: 
 mov    0xfffffff4(%ebp),%eax
 add    %eax,0xfffffff8(%ebp)
 mov    $0x0,%eax

 Код short i,j; j = i + j;
 Компилится в следующее:
 movzwl 0xfffffff8(%ebp),%edx
 movzwl 0xfffffffa(%ebp),%eax
 lea    (%edx,%eax,1),%eax
 mov    %ax,0xfffffffa(%ebp)
 mov    $0x0,%eax

Ну что почувствовал ?:)

aton
()
Ответ на: комментарий от aton

Это кто тебе такого понаписал? Что за процессор у которого нет ah al?
К тому же вопрос был о size_t vs int...

int i,j; j = i + j;
----------------------------
.globl main
.type main, @function
main:
.LFB2:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
movl %edi, -20(%rbp)
movq %rsi, -32(%rbp)
movl -8(%rbp), %eax
addl %eax, -4(%rbp)
movl $0, %eax
leave
ret

----------------------------
----------------------------
size_t i,j; j = i + j;
----------------------------
main:
.LFB2:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
movl %edi, -20(%rbp)
movq %rsi, -32(%rbp)
movq -16(%rbp), %rax
addq %rax, -8(%rbp)
movl $0, %eax
leave
ret

То есть видим что разница только в префиксах.

eXOR ★★★★★
()
Ответ на: комментарий от eXOR

ты префиксами называешь суфиксы? :) По теме: приведенный мной листинг
это выхлоп gcc 4.1.2, камень Core Duo 2, компилялось вообще без опиций.

aton
()
Ответ на: комментарий от aton

> ты префиксами называешь суфиксы? :)

он префиксами называет префиксы:) operand size prefix -- байт-префикс предшествующий инструкции

> компилялось вообще без опиций.

без оптимизации бессмысленно примеры приводить

dilmah ★★★★★
()
Ответ на: комментарий от aton

В инструкции оно пишется перед кодом комманды :). Таки странно как-то то что я привел 4.1.1 AMD 64 тоже без оптимизации.

eXOR ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.