Originalmente, isso faz parte de outra pergunta.
Por que é sizeof
chamado 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.
sizeof(polymorphic_ptr*)
ser constante é bastante contra-intuitivo e simplesmente bobo. Sim, é a maneira C ++, mas bobo, no entanto.Respostas:
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
sizeof
em 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.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
fonte
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. Você pode até usar
sizeof
para 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 usarsizeof
expressões de maneiras que não pode usar expressões em tempo de execução.Os tipos podem variar em tamanho em diferentes plataformas. Usar
sizeof
expressõ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.fonte
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
int
de algum tamanho arbitrário e leia após o final. Se você tiver sorte, obterá,segfault
mas é 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.
fonte