size of a datatype without using sizeof

后端 未结 21 1782
慢半拍i
慢半拍i 2020-12-01 02:34

I have a data type, say X, and I want to know its size without declaring a variable or pointer of that type and of course without using sizeof oper

相关标签:
21条回答
  • 2020-12-01 02:48

    Available since C89 solution that in user code:

    1. Does not declare a variable of type X.
    2. Does not declare a pointer to type X.
    3. Without using sizeof operator.

    Easy enough to do using standard code as hinted by @steve jessop

    offsetof(type, member-designator)

    which expands to an integer constant expression that has type size_t, the value of which is the offset in bytes, to the structure member ..., from the beginning of its structure ... C11 §7.19 3

    #include <stddef.h>
    #include <stdio.h>
    
    typedef struct {
      X member;
      unsigned char uc;
    } sud03r_type;
    
    int main() {
      printf("Size X: %zu\n", offsetof(sud03r_type, uc));
      return 0;
    }
    

    Note: This code uses "%zu" which requires C99 onward.

    0 讨论(0)
  • 2020-12-01 02:50

    Look, sizeof is the language facility for this. The only one, so it is the only portable way to achieve this.

    For some special cases you could generate un-portable code that used some other heuristic to understand the size of particular objects[*] (probably by making them keep track of their own size), but you'd have to do all the bookkeeping yourself.

    [*] Objects in a very general sense rather than the OOP sense.

    0 讨论(0)
  • 2020-12-01 02:51

    One simple way of doing this would be using arrays. Now, we know for the fact that in arrays elements of the same datatype are stored in a contiguous block of memory. So, by exploiting this fact I came up with following:

    #include <iostream>
    using namespace std;
    
    int main()
    {
        int arr[2];
        int* ptr = &arr[0];
        int* ptr1 = &arr[1];
        cout <<(size_t)ptr1-(size_t)ptr;
    }
    

    Hope this helps.

    0 讨论(0)
  • 2020-12-01 02:53

    The correct answer to this interview question is "Why would I want to do that, when sizeof() does that for me, and is the only portable method of doing so?"

    0 讨论(0)
  • 2020-12-01 02:53

    This takes into account that a C++ byte is not always 8 binary bits, and that only unsigned types have well defined overflow behaviour.

    #include <iostream>
    int main () {
        unsigned int i = 1;
        unsigned int int_bits = 0;
        while (i!=0) {
            i <<= 1;
            ++int_bits;
        }
    
        unsigned char uc = 1;
        unsigned int char_bits = 0;
        while (uc!=0) {
            uc <<= 1;
            ++char_bits;
        }
    
        std::cout << "Type int has " << int_bits << "bits.\n";
        std::cout << "This would be  " << int_bits/8 << " IT bytes and "
                  << int_bits/char_bits << " C++ bytes on your platform.\n";
        std::cout << "Anyways, not all bits might be usable by you. Hah.\n";
    }
    

    Surely, you could also just #include <limit> or <climits>.

    0 讨论(0)
  • 2020-12-01 02:56

    Look into the compiler sources. You will get :

    • the size of standard data types.
    • the rules for padding of structs

    and from this, the expected size of anything.

    If you could at least allocate space for the variable, and fill some sentinel value into it, you could change it bit by bit, and see if the value changes, but this still would not tell you any information about padding.

    0 讨论(0)
提交回复
热议问题