相关疑难解决方法(0)

C++ sizeof Vector是24?

我只是在乱搞并学习向量和结构,并且在某一点上,我尝试以字节为单位输出向量的大小.这是代码:

#include <iostream>
#include <vector>

struct Foo{
    std::vector<int> a;
};

int main()
{
    using std::cout; using std::endl;   

    Foo* f1 = new Foo;

    f1->a.push_back(5);
    cout << sizeof(f1->a) << endl;
    cout << sizeof(f1->a[0]) << endl;

    delete[] f1;
}
Run Code Online (Sandbox Code Playgroud)

输出是244.

显然第二行打印4,因为那是int的大小.但为什么另一个值24呢?向量是否占用24个字节的内存?谢谢!

c++ vector

24
推荐指数
1
解决办法
9165
查看次数

取消引用无效指针,然后获取结果的地址

考虑:

int* ptr = (int*)0xDEADBEEF;
cout << (void*)&*ptr;
Run Code Online (Sandbox Code Playgroud)

*如果它与一个立即使用&并且假设没有超载op&/ 在场,那么它是多么违法op*


(这对解决过去的数组元素有一个特殊的影响&myArray[n],这个表达式明确相当于&*(myArray+n).这个Q&A解决了更广泛的情况,但我不觉得它真的满足了上面的问题.)

c++ pointers

23
推荐指数
2
解决办法
3129
查看次数

如何避免指针运算中的乘法?

如果我写

int main(int argc, char *argv[])
{
    int temp[50][3];
    return &temp[argc] - &temp[0];
}
Run Code Online (Sandbox Code Playgroud)

并使用Visual C++编译它,我回来了:

009360D0 55                   push        ebp  
009360D1 8B EC                mov         ebp,esp  
009360D3 8B 45 08             mov         eax,dword ptr [argc]  
009360D6 8D 0C 40             lea         ecx,[eax+eax*2]  
009360D9 B8 AB AA AA 2A       mov         eax,2AAAAAABh  
009360DE C1 E1 02             shl         ecx,2  
009360E1 F7 E9                imul        ecx  
009360E3 D1 FA                sar         edx,1  
009360E5 8B C2                mov         eax,edx  
009360E7 C1 E8 1F             shr         eax,1Fh  
009360EA 03 C2                add         eax,edx  
009360EC …
Run Code Online (Sandbox Code Playgroud)

c++ code-generation multiplication pointer-arithmetic visual-c++

5
推荐指数
1
解决办法
1223
查看次数