zoukankan      html  css  js  c++  java
  • (转)sizeof()和_countof()区别

    先看程序:

    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char* argv[])
    
    {
    
        char *a = "abcde";
    
        char sz1[] = "abc";
    
        char sz2[] = {"abc"};
    
        char sz3[] = { 'a', 'b', 'c' };
    
     
    
        printf_s( "%d %d %d %d", _sizeof(a), _countof(sz1), _countof(sz2), _countof(sz3) );
    
        cout<<endl;
    
     
    
        int b[] = {1,2,3};
    
        cout<<sizeof(b)<<" "<<_countof(b)<<endl;
    
        return 0;
    
    }
    
    程序输出:4 4 4 3
    
                     12    3
    
    //***************************************************************************//
    
    _countof 是 C++中计算一个固定大小数组长度的宏,比如:
    
    T arr[10];
    
    for( size_t i = 0; i<_countof(arr); --i )   do_something();
    
    // 对于固定大小数组计算起来非常方便。
    
    /* _countof helper */
    #if !defined(_countof)
    #if !defined(__cplusplus)
    #define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0]))
    #else
    extern "C++"
    {
    template <typename _CountofType, size_t _SizeOfArray>
    char (*__countof_helper(UNALIGNED _CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray];
    #define _countof(_Array) sizeof(*__countof_helper(_Array))
    }
    #endif
    #endif

    用宏计算的方式容易理解,但是编译期语法检查不够严格。C++中使用了比较严格的语法,确保传入的参数是固定数组。

    C++采用type_traits的方式来提取给定数组的信息,通过一个模板函数来完成这个操作:

    __countof_helper(UNALIGNED _CountofType (&_Array)[_SizeOfArray]) 函数来提取_Array的信息:

    参数为_Array的引用,保证传入参数必须为固定数组,类型为_CountofType, 大小为_SizeofArray.

    返回值为: char (*Arr)[_SizeofArray];指向大小为_SizeofArray 的char类型的数组的指针。

  • 相关阅读:
    华为笔试
    进程间通信——管道通信
    进程间通信——使用WM_COPYDATA消息通信
    混合高斯背景建模
    基于mean shift的目标跟踪算法
    Lukas-Kanade光流法
    【CUDA并行编程之八】Cuda实现Kmeans算法
    【CUDA并行编程之七】数组元素之和
    【CUDA并行编程之六】KNN算法的并行实现
    【CUDA并行编程之五】计算向量的欧式距离
  • 原文地址:https://www.cnblogs.com/qijicxl/p/3614421.html
Copyright © 2011-2022 走看看