Por que sizeof é chamado de operador em tempo de compilação?

12

Originalmente, isso faz parte de outra pergunta.

Por que é sizeofchamado de operador em tempo de compilação? Na verdade , não é um operador de tempo de execução? E se é realmente um operador em tempo de compilação, como ajuda na produção de código portátil que executa o mesmo em computadores diferentes? Por favor, explique em detalhes.

O codificador pacífico
fonte
4
respondidas em detalhes em SO: Por que sizeof (x ++) não incrementa x?
Gnat #
3
Como você espera que o tamanho de um tipo mude em tempo de execução?
@ MichaelT: O tamanho de uma instância de um tipo certamente pode mudar - afinal, há polimorfismo de classe. Eu diria que sizeof(polymorphic_ptr*)ser constante é bastante contra-intuitivo e simplesmente bobo. Sim, é a maneira C ++, mas bobo, no entanto.
Restabeleça Monica
@KubaOber Indeed. Estou curioso para saber como o OP achou que deveria se comportar em diferentes casos e, esperançosamente, obter algum código que demonstrasse sua confusão sobre isso para ajudar a expandir a questão.
4
Vim para votar a resposta "porque funciona em tempo de compilação", deixou decepcionado.
Ben Jackson

Respostas:

23

sizeof()fornece o tamanho do tipo de dados , não o tamanho de uma instância específica desse tipo na memória.

Por exemplo, se você tivesse um objeto de dados de sequência que alocasse uma matriz de caracteres de tamanho variável em tempo de execução, sizeof()não poderia ser usado para determinar o tamanho dessa matriz de caracteres. Daria apenas o tamanho do ponteiro.

O tamanho de um tipo de dados é sempre conhecido em tempo de compilação.


fonte
3
Como o C (++) não possui metadados de objetos em tempo de execução, você também não pode obter essas coisas em tempo de execução.
C. Ross
5
Na verdade, se você usar sizeofem uma matriz, você vai obter o tamanho da matriz (isto é as vezes o tamanho elemento o número de elementos). Mas se você usá-lo em um ponteiro, você obtém apenas o tamanho do ponteiro. Portanto, como na maioria dos casos em que você gostaria de saber o tamanho de uma matriz, você só tem um ponteiro, não é tão útil.
sepp2k
1
@ Jens A questão está marcada com [C ++] e o VLA não entrou no padrão C ++.
Authchir
13

porque todo o tamanho da "chamada" é calculado em tempo de compilação e o que estiver entre parênteses é descartado e não é executado no tempo de execução,

o resultado é puramente baseado em informações de tipo estático disponíveis para o compilador

catraca arrepiante
fonte
7

Por que sizeof é chamado de operador em tempo de compilação?

Porque, em tempo de compilação, o compilador calcula o tamanho da expressão e substitui esse valor constante em tempo de compilação.

Não é realmente um operador de tempo de execução?

Não. Você pode até usar sizeofpara avaliar o tamanho das expressões que você não pode executar legalmente (ou seja, isso implicaria um comportamento indefinido), desde que o compilador possa descobrir qual é o tipo da expressão.

Além disso, mesmo antes do C ++ 11 constexpr, você pode usar sizeofexpressões de maneiras que não pode usar expressões em tempo de execução.

E se é realmente um operador em tempo de compilação, como ajuda na produção de código portátil ...

Os tipos podem variar em tamanho em diferentes plataformas. Usar sizeofexpressões em vez de suposições codificadas significa que seu código não será quebrado quando você compilar em uma plataforma diferente e seus tipos mudarem de tamanho.

Sem utilidade
fonte
1
Bem, acho esta a resposta mais útil;). Bro (supondo que você seja homem), eu tenho uma dúvida. Você quer dizer que quando as pessoas dizem que sizeof torna os programas portáteis, elas significam que o código-fonte pode ser compilado sem erros em todas as máquinas e não significa que o programa executável pode ser executado em qualquer máquina. Certo ? Se isso estiver certo, minha dúvida será realmente esclarecida.
The Peaceful Coder
1
Sim, o código é portátil, no sentido em que você pode compilar um binário correto (diferente) para cada plataforma.
Inutil)
5

O C ++, na verdade, não armazena os metadados dos objetos em tempo de execução, portanto a verificação do tamanho deve ser em tempo de compilação. Para um exemplo de como o C ++ não valida o tamanho, declare uma matriz intde algum tamanho arbitrário e leia após o final. Se você tiver sorte, obterá, segfaultmas é mais provável, que simplesmente leia sem sentido, porque o C ++ não controla o tamanho da sua matriz.

Consulte Um programa C / C ++ pode falhar seg após ler o final de uma matriz (UNIX)? para um exemplo de SO.

Cruz
fonte