在指针内存储标志

时间:2017-10-20 13:50:17

标签: c++ pointers

我听说过很多关于在指针中存储外部数据的事情。 例如(短字符串优化)。

例如:

当我们想要为<<类重载SSO时,取决于我们要打印指针或字符串值的字符串的长度。

我们可以在指针本身内编码这个标志,而不是创建bool flag。如果我没有弄错它的感谢PC架构添加填充以防止未签名的内存访问。

但我还没有在例子中看到它。我们怎样才能检测到这样的标志,当&这样的二进制操作检查RSB或LSB是否设置为1(作为标志)时,指针上是不允许的?这也不会解除引用指针吗?

感谢所有答案。

2 个答案:

答案 0 :(得分:2)

很有可能做这些事情(不像其他人说的那样)。大多数现代体系结构(例如x86-64)强制执行对齐要求,允许您使用指针的最低有效位可能为零的事实,并利用该存储空间其他目的。

让我暂停一下,然后说我要描述的内容被认为是未定义的行为&#39;由C&amp; C ++标准。您可以通过我所描述的方式以不可移植的方式离开轨道,但是有更多标准来管理计算机规则而不是C ++标准(例如处理器程序集参考和架构文档)。注意事项。

假设我们正在使用x86_64,我们假设您有一个以指针成员开头的类/结构:

struct foo {
    bar * ptr;
    /* other stuff */
};

通过x86架构约束,foo 中的指针必须在8字节边界上对齐。在这个简单的例子中,你可以假设每个指向struct foo的指针都是一个可被8整除的地址,这意味着foo *的最低3位将为零。

为了利用这样的约束,你必须玩一些转换游戏以允许指针被视为不同的类型。有许多不同的方法来执行转换,范围从旧的C方法(不推荐)将其转换为uintptr_t以及将指针包装在联合中的更清洁方法。为了访问指针或辅助数据,您需要逻辑上和#39;和&#39;带有位掩码的数据,用于将您不希望的基准部分归零。

作为这个解释的一个例子,几年前我写了一个AVL树,它将平衡簿保存数据汇入指针,你可以在这里查看一下这个例子:https://github.com/jschmerge/structures/blob/master/tree/avl_tree.h#L31(你所做的一切)需要查看的内容包含在我引用的行中的struct avl_tree_node中。

回到你在初始问题中提到的话题......短字符串优化并没有以相同的方式实现完全。它在Clang和GCC的标准库中的实现有所不同,但两者都归结为使用union来使用指针或字节数组重载存储块,并使用字符串&#播放一些巧妙的技巧39; s内部长度字段,用于区分数据是指针还是本地数组。有关更多详细信息,此博客文章非常擅长解释:https://shaharmike.com/cpp/std-string/

答案 1 :(得分:1)

  

&#34;在指针本身内编码此标志&#34;

不,您不能在C或C ++中执行此操作。

设置(更不用说解除引用)指向您不拥有的内存的指针是 undefined 两种语言。

可悲的是,你想要实现的是在汇编程序级别完成,其中指针和整数之间的区别已经足够模糊。