WebRTC源码分析-定位之Location

Location类提供了一个对象构建时所在位置的基础信息,是chromium项目中的https://code.google.com/p/chromium/codesearch#chromium/src/base/location.h精简版本。在WebRTC项目中位于rtc_base/location.h和rtc_base/location.cc中。

class Location {
 public:
  // Constructor should be called with a long-lived char*, such as __FILE__.
  // It assumes the provided value will persist as a global constant, and it
  // will not make a copy of it.
  //
  // TODO(deadbeef): Tracing is currently limited to 2 arguments, which is
  // why the file name and line number are combined into one argument.
  //
  // Once TracingV2 is available, separate the file name and line number.
  Location(const char* function_name, const char* file_and_line);
  Location();
  Location(const Location& other);
  Location& operator=(const Location& other);
  const char* function_name() const { return function_name_; }
  const char* file_and_line() const { return file_and_line_; }
  std::string ToString() const;

 private:
  const char* function_name_;
  const char* file_and_line_;
};

// Define a macro to record the current source location.
#define RTC_FROM_HERE RTC_FROM_HERE_WITH_FUNCTION(__FUNCTION__)
#define RTC_FROM_HERE_WITH_FUNCTION(function_name) \
  ::rtc::Location(function_name, __FILE__ ":" STRINGIZE(__LINE__))
} 

该类简单易懂,但是简单之中也存在一些值得注意之处:

  • 由Location的两个成员function_name_与file_and_line_可知,Location存储着对象在哪个函数中产生,对象在哪个文件的哪一行代码中产生的信息。
  • 虽然Location提供了4个构造函数,实际使用上并不会直接使用构造方法去创建Location对象,而是使用宏RTC_FROM_HERE。如果将该宏展开,会发现其等效于:Location( __FUNCTION __, __FILE __ ":" #( __LINE __)),其中 __FUNCTION __,__FILE __,__LINE __是C++编译器的内置宏定义,分别输出代码所在的函数名,文件名以及行号。
  • 上述宏相当于调用Location类的Location(const char* function_name, const char* file_and_line)构造函数,并传入了由C++内置宏静态编译时产生的字符串常量,这些常量都是long-lived char*,因此,上述构造函数没有对传入的值重新分配空间来拷贝字符串,而是简单的记录这些常量字符串的地址。同时,Location也没有提供析构函数来销毁内部function_name_以及file_and_line_所占用的空间,直到程序尽头所占空间自然释放。
  • 同上述原因,Location的拷贝构造与赋值构造也不会为内部的成员重新分配空间,没有使用深拷贝。

Location类的源码如下所示

Location::Location(const char* function_name, const char* file_and_line)
    : function_name_(function_name), file_and_line_(file_and_line) {}

Location::Location() : function_name_("Unknown"), file_and_line_("Unknown") {}

Location::Location(const Location& other)
    : function_name_(other.function_name_),
      file_and_line_(other.file_and_line_) {}

Location& Location::operator=(const Location& other) {
  function_name_ = other.function_name_;
  file_and_line_ = other.file_and_line_;
  return *this;
}

std::string Location::ToString() const {
  char buf[256];
  snprintf(buf, sizeof(buf), "%s@%s", function_name_, file_and_line_);
  return buf;
}

总结

  • Location类记录对象产生的函数名,文件名+行号信息。这些信息由C++编译器内置宏 __FUNCTION __,__FILE __,__LINE __提供,编译期被转化为常量字符串。
  • Location类的构造函数并不执行内存拷贝在其内部存储上述常量字符串的信息,而是简单的记录上述常量字符串的地址,同时,也没有提供析构函数以销毁上述字符串所占空间。这样可以避免反复的进行内存申请,拷贝和释放,以提升效率。
  • 实际应用上,通常通过宏定义RTC_FROM_HERE来产生Location对象,记录此时Location对象出生位置。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容