Cada tipo numérico ocupa uma quantidade diferente de bytes na memória, #SQN

Cada tipo numérico precisa de uma quantidade específica de bytes em memória para ser representado. Quanto maior a quantidade de bytes demandada, maior o range de valores suportados.

#include 

int main() {
	std::cout << "sizeof(char)      : " << sizeof(char) << std::endl;
	std::cout << "sizeof(short)     : " << sizeof(short) << std::endl;
	std::cout << "sizeof(int)       : " << sizeof(int) << std::endl;
	std::cout << "sizeof(long)      : " << sizeof(long) << std::endl;
	std::cout << "sizeof(long long) : " << sizeof(long long) << std::endl;

	std::cout << "Range for int : "
		<< std::numeric_limits<int>::min()
		<< " - "
		<< std::numeric_limits<int>::max() << std::endl;

	std::cout << "Range for long: "
		<< std::numeric_limits<long>::min()
		<< " - "
		<< std::numeric_limits<long>::max() << std::endl;
}

É interessante notar, entretanto, que, por motivos históricos, a Microsoft escolheu manter, em C++, o tipo long com 4 bytes, mesmo em sistemas de 64 bits. Isso significa que, modernamente, em C++, int e long demandam a mesma quantidade de bytes e suportam o mesmo range de valores.

Sabendo que cada tipo demanda uma quantidade de bytes diferente, seria natural assumir que esses tipos ocupassem quantidades diferentes de memória na stack.

#include <iostream>

void doubleIt(
	char a,
	short b,
	int c,
	long long d,
	char* da,
	short* db,
	int* dc,
	long long* dd
)
{
	*da = a + a;
	*db = b + b;
	*dc = c + c;
	*dd = d + d;
}

int main() {
	const char a = 1;
	const short b = 2;
	const int c = 4;
	const long long d = 8;
	
	char da = 0;
	short db = 0;
	int dc = 0;
	long long dd = 0;

	doubleIt(a, b, c, d, &da, &db, &dc, &dd);

	std::cout <<
		"double of " << +a << " is " << +da << std::endl <<
		"double of " << b << " is " << db << std::endl <<
		"double of " << c << " is " << dc << std::endl <<
		"double of " << d << " is " << dd << std::endl;

}

Entretanto, este não é o caso.

	.model flat,c
        .code

doubleIt_ proc

	push ebp
	mov ebp, esp

	; da
	mov al, [ebp + 8]
	add al, al
	mov ebx,[ebp + 28]
	mov [ebx], al

	; db
	mov ax, [ebp + 12]
	add ax, ax
	mov ebx,[ebp + 32]
	mov [ebx], ax

	; dc
	mov eax, [ebp + 16]
	add eax, eax
	mov ebx,[ebp + 36]
	mov [ebx], eax

	; dd
	mov eax, [ebp + 20]
	mov edx, [ebp + 24]
	add eax, eax
	adc edx, edx
	mov ebx,[ebp + 40]
	mov [ebx], eax
	mov [ebx+4], edx

	pop ebp
	ret

doubleIt_ endp

	end 

Em arquiteturas de 32 bits, o transporte de dados com tamanhos múltiplos desse tamanho é mais eficiente. Por essa razão, os valores na stack acabam organizados em múltiplos de 32 bits.

Dessa forma, tipos que ocupam menos que 32 bits são complementados com “espaço inútil”.

Não adianta escolher tipos menores para “economizar espaço” na stack.

Compartilhe este insight:

Comentários

Participe deixando seu comentário sobre este artigo a seguir:

Subscribe
Notify of
guest
2 Comentários
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Thiago Lunardi
Thiago Lunardi
4 anos atrás

Ok, Não há memory leak, mas e performance? Realizar processamentos com tipos menores é mais barato? Acessar, ler e transportar valores de tipos menores trazem aumento de velocidade no processamento contrar tipos maiores?

Elemar Júnior
Elemar Júnior
4 anos atrás

Para tipos primitivos, na stack, a princípio não há ganho nenhum percebido para tipos “menores”. O transporte geralmente acontece em 32 bits mesmo.

AUTOR

Elemar Júnior
Fundador e CEO da EximiaCo atua como tech trusted advisor ajudando empresas e profissionais a gerar mais resultados através da tecnologia.

NOVOS HORIZONTES PARA O SEU NEGÓCIO

Nosso time está preparado para superar junto com você grandes desafios tecnológicos.

Entre em contato e vamos juntos utilizar a tecnologia do jeito certo para gerar mais resultados.

Insights EximiaCo

Confira os conteúdos de negócios e tecnologia desenvolvidos pelos nossos consultores:

Arquivo

Pós-pandemia, trabalho remoto e a retenção dos profissionais de TI

CTO Consulting e Especialista em Execução em TI
EximiaCo 2024 - Todos os direitos reservados
2
0
Queremos saber a sua opinião, deixe seu comentáriox
()
x
Oferta de pré-venda!

Mentoria em
Arquitetura de Software

Práticas, padrões & técnicas para Arquitetura de Software, de maneira efetiva, com base em cenários reais para profissionais envolvidos no projeto e implantação de software.

Muito obrigado!

Deu tudo certo com seu envio!
Logo entraremos em contato

Cada tipo numérico ocupa uma quantidade diferente de bytes na memória, #SQN

Para se candidatar nesta turma aberta, preencha o formulário a seguir:

Cada tipo numérico ocupa uma quantidade diferente de bytes na memória, #SQN

Para se candidatar nesta turma aberta, preencha o formulário a seguir:

Condição especial de pré-venda: R$ 14.000,00 - contratando a mentoria até até 31/01/2023 e R$ 15.000,00 - contratando a mentoria a partir de 01/02/2023, em até 12x com taxas.

Tenho interesse nessa capacitação

Para solicitar mais informações sobre essa capacitação para a sua empresa, preencha o formulário a seguir:

Tenho interesse em conversar

Se você está querendo gerar resultados através da tecnologia, preencha este formulário que um de nossos consultores entrará em contato com você:

O seu insight foi excluído com sucesso!

O seu insight foi excluído e não está mais disponível.

O seu insight foi salvo com sucesso!

Ele está na fila de espera, aguardando ser revisado para ter sua publicação programada.

Tenho interesse em conversar

Se você está querendo gerar resultados através da tecnologia, preencha este formulário que um de nossos consultores entrará em contato com você:

Tenho interesse nessa solução

Se você está procurando este tipo de solução para o seu negócio, preencha este formulário que um de nossos consultores entrará em contato com você:

Tenho interesse neste serviço

Se você está procurando este tipo de solução para o seu negócio, preencha este formulário que um de nossos consultores entrará em contato com você:

× Precisa de ajuda?