首页 / 更多教程 / c – 分区内存时严格别名和对齐问题
c – 分区内存时严格别名和对齐问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c – 分区内存时严格别名和对齐问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2091字,纯文字阅读大概需要3分钟。
内容图文
![c – 分区内存时严格别名和对齐问题](/upload/InfoBanner/zyjiaocheng/956/b5f9ad7c85114ee7808f28f89a36e6a1.jpg)
我的目标是分配一块内存,然后将其分成不同类型的较小数组.关于我在这里写的代码,我有几个问题:
#include <iostream>
#include <cstdint>
#include <cstdlib>
int main() {
constexpr std::size_t array_count = 5;
constexpr std::size_t elements_size = sizeof(std::uint32_t) + sizeof(std::uint16_t);
void* const pv = std::calloc(array_count, elements_size);
//Partition the memory. p32 array starts at pv, p16 array starts after the 20 byte buffer for the p32 array.
std::uint32_t* const p32 = (std::uint32_t *) pv;
std::uint16_t* const p16 = (std::uint16_t *)((char *) pv + sizeof(std::uint32_t) * array_count);
//Initialize values.
for(std::size_t i = 0; i < array_count; ++i) {
p32[i] = i;
p16[i] = i * 2;
}
//Read them back.
for(std::size_t i = 0; i < array_count; ++i) {
std::cout << p32[i] << std::endl;
std::cout << p16[i] << std::endl;
std::cout << std::endl;
}
std::free(pv);
}
>此代码是否违反了c严格的别名规则?从malloc或calloc调用转换指针时,我在查找别名资源时遇到问题. p32和p16指针永远不应重叠.
>如果我反转p16从pv开始的两个数组的定位,并且p32与pv有10个字节的偏移,这可能会导致段错误,因为uint32_t与4字节边界对齐pv 10可能在2字节边界上,右边?
>这个程序是不安全的,还是引入了我一般都缺少的任何未定义的行为?我在本地计算机上获得了预期的输出,但当然这并不意味着我的代码是正确的.
解决方法:
是的,该计划是UB.当你这样做:
for(std::size_t i = 0; i < array_count; ++i) {
p32[i] = i;
p16[i] = i * 2;
}
p32或p16指向的uint32_t或uint16_t对象没有. calloc只给你字节,而不是对象.你不能只是将reinterpret_cast对象存在.最重要的是,索引仅为数组定义,而p32不指向数组.
要使其定义良好,您必须创建一个数组对象.但是,数组的placement-new是broken,所以你可以手动初始化一堆uint32_ts,如:
auto p32 = reinterpret_cast<uint32_t*>(pv);
for (int i = 0; i < array_count; ++i) {
new (p32+i) uint32_t; // NB: this does no initialization, but it does satisfy
// [intro.object] in actually creating an object
}
然后这将遇到一个单独的问题:CWG 2182.现在我们有array_count uint32_ts,但是我们没有uint32_t [array_count]所以索引仍然是UB.基本上,完全没有办法用纯粹的标准C来写这个.另见my similar question on the topic.
也就是说,在野外执行此操作的代码量非常大,每个实现都允许您执行此操作.
内容总结
以上是互联网集市为您收集整理的c – 分区内存时严格别名和对齐问题全部内容,希望文章能够帮你解决c – 分区内存时严格别名和对齐问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。