在 C/C++ 中编译时解析的地址偏移量
Are address offsets resolved during compile time in C/C++?
void *p = malloc(1000);
*((int*)p) = 666;
*((int*)p+sizeof(int)) = 777;
int i;
for (i = 0; i<10; ++i)
printf("%d ", *((int*)p+sizeof(int)*i));
手动偏移是在编译时解决的,还是增加了在运行时执行算术运算的开销?
即使你有一个常量而不是sizeof(int)
,编译器也无法提前知道p
中的地址,所以它必须做加法。如果你有类似i = sizeof(int)+4
的东西,那么它应该做优化编译时,并直接i
设置为8
。
另外,我认为当您这样做时:
*((int*)p+sizeof(int)) = 777;
你的意思是:
*((int*)p + 1) = 777; /* or ((int*)p)[1] = 777; */
类似printf("%d ", *((int*)p+sizeof(int)*i));
应该是:
printf("%d ", *((int*)p + i));
sizeof(int)
在编译时是绝对已知的,有效利用这些信息是有意义的。但是,不能保证给定的编译器会生成如下内容:
mov dword [ebx+16], 777
而不是这样的东西:
mov ecx, 16
mov dword [ebx+ecx], 777
或
lea ebx, [ebx+16]
mov dword [ebx], 777
甚至
add ebx, 16
mov dword [ebx], 777
相关文章:
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 通过指针偏移量访问结构变量值
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- librdkafka:rd_kafka_assignment 返回分配分区的偏移量 -1001
- 是否通过向封闭对象的地址添加字节偏移量来访问子对象
- 向指针地址添加 20 个字节偏移量
- glMapBufferRange(..) 中的偏移量关系和 glDrawArraysInstanced(..) 中的第一
- 是否有与 C# Structs/StructLayout 等效的功能,C++中的字段偏移量?
- 我的 sumASCII 函数中的此偏移量是多少?
- boost::序列化中的派生类偏移量计算.有效吗?
- RedisGraph 语法错误在偏移量 8 靠近"创建"
- 使用基地址和偏移量获取变量的地址
- GDB 显示损坏的指令地址偏移量
- C++如何使用读取进程内存查找进程内存中使用的最后一个(偏移量 - 地址)
- 没有用指针和偏移量获得正确的地址
- C++ 读取内存地址/指针和偏移量
- 在 C/C++ 中编译时解析的地址偏移量
- standard_layout类的数据成员是否与对象的地址有固定的偏移量?
- c++内存地址和偏移量写/读
- c++用指针+偏移量读内存地址