ite*_*ter 17 memory-management arduino
我之前曾问过类似的问题,但我意识到我无法对宏观和模板做出正面或反面.我是一名C(而不是C++)程序员.
F()实际上做了什么?什么时候将字符填入pgmem?什么时候从pgmem中拉出角色?它会缓存它们吗?它如何处理低内存情况?
use*_*342 26
没有涉及模板,只有函数重载.该F()宏做了两两件事:
用于PSTR确保文字字符串存储在闪存中(代码空间而不是数据空间).但是,PSTR("some string")无法打印,因为它会收到一个简单的char *,表示存储在Flash中的字符串的基址.取消引用该指针将访问数据中相同地址的一些随机字符.这也是为什么F()......
投下的结果PSTR()来__FlashStringHelper*.诸如print和println重载的函数,以便在接收__FlashStringHelper*参数时,它们正确地取消引用闪存中的字符.
顺便提一句。对于 ESP32 库,这两个函数都在以下文件中定义:
# PSTR : ../Arduino/hardware/espressif/esp32/cores/esp32/pgmspace.h
# F : ../Arduino/hardware/espressif/esp32/cores/esp32/WString.h
Run Code Online (Sandbox Code Playgroud)
以及 F(x):
// An abstract class used as a means to provide a unique pointer type
// but really has no body
class __FlashStringHelper;
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))
...
Run Code Online (Sandbox Code Playgroud)
同样对于 ESP32,PSTR(x)不需要,只是x : #define PSTR(s) (s)。
| 归档时间: |
|
| 查看次数: |
10832 次 |
| 最近记录: |