我有一个非常简单的应用程序基于构建您的第一个应用程序教程.有两种活动:MainActivity调用DisplayMessageActivity通过startActivity().
进入时DisplayMessageActivity,我看到:
MainActivity.onStop()
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,但是当我按下后退按钮返回父母时MainActivity,我得到:
MainActivity.onDestroy()
MainActivity.onCreate(null)
MainActivity.onStart()
Run Code Online (Sandbox Code Playgroud)
对于这个非常简单的应用程序,活动总是被破坏.但根据文档(第二个要点),典型的行为是在这种情况下停止和重新启动活动.
此外,onDestroy()首次启动子活动时不会发生,但只会单击一次后退按钮.
两个问题:
null被传到onCreate()这里?这阻止了我保持状态onSaveInstanceState().请注意,我已经验证设置 - >开发者选项 - >应用 - >不要保持活动未选中.
编辑:
以下是子活动与父级链接的方式:
<activity
android:name="com.example.helloworld.DisplayMessageActivity"
android:label="@string/title_activity_display_message"
android:parentActivityName="com.example.helloworld.MainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.helloworld.MainActivity" />
</activity>
Run Code Online (Sandbox Code Playgroud)
追踪DisplayMessageActivity.onOptionsItemSelected(),我可以看到它在呼唤Activity.onNavigateUp().
在以下伪代码中:
if (rdtscp supported by hardware) {
Invoke "rdtscp" instruction
} else {
Invoke "rdtsc" instruction
}
Run Code Online (Sandbox Code Playgroud)
假设CPU不支持该rdtscp指令,因此我们回退到else语句.
如果CPU错误预测分支,指令管道是否可能尝试执行rdtscp并抛出Illgal Instruction错误?
在以下示例中:
#include <iostream>
struct A {
int z;
A(std::string) {}
A() = default;
};
int main() {
char buf[1000];
std::fill(buf, buf + 1000, 'x');
auto a = new(buf) A{};
std::cerr << "A.z: " << a->z << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
用GCC 4.8编译输出零(与Clang 3.4相同的行为).这似乎表明a在调用默认构造函数之前进行了零初始化.
但是根据cppreference.com上的值初始化规则,在默认构造函数调用之前不应该初始化该对象.类A符合C++ 11下的要点#1:
1)如果T是具有至少一个用户提供的任何类型构造函数的类类型,则调用默认构造函数.
另一种可能是有用的数据点是,如果我们更换A() = default用A() {}在上面的例子中,没有零初始化发生的预期.这似乎表明在初始示例中遵循了值初始化的项目符号#2,这将是错误的:
2)如果T是没有任何用户提供的构造函数的非联合类类型,则该对象被零初始化,然后调用隐式声明的默认构造函数(除非它是微不足道的)