Android 为什么即使优化级别为3,向量分配也要花费这么多时间?

Android 为什么即使优化级别为3,向量分配也要花费这么多时间?,android,c++,android-ndk,Android,C++,Android Ndk,之前我在这里问过类似的问题 问题是这个代码 #include <chrono> #include <android/log.h> #include <vector> while (true) { const int sz = 2048*2048*3; std::vector<unsigned char> v; { auto startTime = std::chro

之前我在这里问过类似的问题

问题是这个代码

#include <chrono>
#include <android/log.h>
#include <vector>

while (true)
    {
        const int sz = 2048*2048*3;
        std::vector<unsigned char> v;
        {
            auto startTime = std::chrono::system_clock::now();
            v.resize(sz);
            auto duration = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now() - startTime);
            __android_log_print(ANDROID_LOG_ERROR, "READFILE 1", "v.resize(%d) time : %lld\n", sz, duration.count());
        }
        {
            auto startTime = std::chrono::system_clock::now();
            v.resize(0);
            auto duration = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now() - startTime);
            __android_log_print(ANDROID_LOG_ERROR, "READFILE 2", "v.resize(0) time : %lld\n", duration.count());
        }
        {
            auto startTime = std::chrono::system_clock::now();
            v.resize(sz);
            auto duration = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now() - startTime);
            __android_log_print(ANDROID_LOG_ERROR, "READFILE 3", "v.resize(%d) time : %lld\n", sz, duration.count());
        }
    }
在@Snild Dolkow的帮助下,我成功地将这一次的时间缩短到了4毫秒

E/READFILE 1: v.resize(12582912) time : 573
E/READFILE 2: v.resize(0) time : 0
E/READFILE 3: v.resize(12582912) time : 4683
E/READFILE 1: v.resize(12582912) time : 557
E/READFILE 2: v.resize(0) time : 0
E/READFILE 3: v.resize(12582912) time : 4680
E/READFILE 1: v.resize(12582912) time : 552
E/READFILE 2: v.resize(0) time : 0
E/READFILE 3: v.resize(12582912) time : 4683
我刚刚在我的
CMakeList.txt
文件中添加了这几行

target_compile_options(native-lib PRIVATE
    "$<$<CONFIG:RELEASE>:-O3>"
    "$<$<CONFIG:DEBUG>:-O3>")
target\u compile\u选项(本机库专用)
"$"
"$")
但我意识到,不管怎样,你可以在第二个日志中看到的时间,现在真的是合乎逻辑的。。。这里发生了一些奇怪的事情

看一看-第一次分配需要552微秒,然后调整到0需要0毫秒(这是可以的),但最后一次调整大小实际上是调整到与第一次调整大小相同的大小需要4600微秒

这是不可能的,因为向量已经调整了大小,当我调用resize到0时,唯一更改的值是内部元素的实际计数,所以再次调用resize到之前的数字意味着只更改向量实现内部的计数,换句话说,不应超过0微秒


所以,问题是——它真的是ndk bug吗?或者,我错过了什么

您缺少
std::vector::resize(N,T defaultVal=T{})
将所有N个值设置为
defaultVal
。如果未指定默认值,则默认值为
t{}
。对你来说,那是零


只进行分配而不影响值的方法称为
std::vector::reserve(N)
。相关函数是:代码>:ST::(代码:< /Cord>)和“代码>:STD::vector::/SypultoToFig():<代码> < /p >不确定哪个C++版本NDK使用,但是在C++ 11代码> Resisid中有两个重载:<代码>空隙调整(sisiz类型n)< />代码> <代码>空隙调整(sisithyType N,const ValueSype和Value:<代码> >)@cbuchart:第一个重载定义为如我所述的行为。但是如何解释他的
resize()
#3始终比
resize()
#1花费更长的时间,两者都将向量设置为相同的大小?非安卓系统会产生相反的结果。
target_compile_options(native-lib PRIVATE
    "$<$<CONFIG:RELEASE>:-O3>"
    "$<$<CONFIG:DEBUG>:-O3>")