(转)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类型的数组的指针。

最新文章

  1. 图论 - Travel
  2. Android俄罗斯方块AI设计文档
  3. nginx 负载均衡策略
  4. Qt5 QTableWidget设置列表自动适应列宽
  5. Call C# in powershell
  6. 基于deb包快速搭建内外apt源
  7. 简单实用 “易忘” 的SQL 语句语法,新老皆宜
  8. iOS keyChain(钥匙串)的简单使用
  9. [编织消息框架][传输协议]sctp
  10. linux --&gt; 获取系统启动时间
  11. git push时报错:Updates were rejected because the tip of your current branch is behind
  12. 获取百度地图POI数据三(模拟关键词搜索)
  13. [20181130]如何猜测那些值存在hash冲突.txt
  14. 牛客网-2018年全国多校算法寒假训练营练习比赛(第四场)-A
  15. Ajax 执行顺序
  16. Grafana 安装及 Windows 应用程序服务配置工具 NSSM使用
  17. django-ajax post与get请求
  18. ubuntu解压命令(转)
  19. 网页登入验证码的实现(java&amp;html)
  20. ubuntu下安装配置minicom(解决默认的端口/dev/tty8,改不过来的问题)

热门文章

  1. UESTC - 621
  2. phpcms V9 框架目录结构
  3. Flask项目出现html文件无法自动补全
  4. js数组方法详解
  5. Python 垃圾回收机制(转)
  6. python-OS.path.join()路径拼接
  7. SpringBoot 思维导图
  8. Ubuntu安装Docker步骤
  9. 参考美团、饿了么 &amp;&amp; localStorage
  10. C++编程规范(摘记)