谁能告诉我为什么 code1 和 code2 有不同的结果,而 code3 和 code4 有相同的结果。
代码1:
o = {x = "hi"}
mt = {}
mt.__gc = function (o) print(o.x) end
setmetatable(o, mt)
o = nil
collectgarbage()
Run Code Online (Sandbox Code Playgroud)
代码1的结果:
你好
代码2:
o = {x = "hi"}
mt = {}
setmetatable(o, mt)
mt.__gc = function (o) print(o.x) end
o = nil
collectgarbage()
Run Code Online (Sandbox Code Playgroud)
code2:nothing的结果
code1和code2唯一的区别就是语句setmetatable(o, mt)和语句mt.__gc = function (o) print(o.x) end的执行顺序不同。他们的结果完全不同:第一个打印 hi 而另一个什么都不打印。将元表设置为对象的顺序最终会影响结果吗?如果是,为什么 code3 和 code4 有相同的结果?
代码3
o = {x = "hi"}
mt = {} …Run Code Online (Sandbox Code Playgroud) -rdynamic我尝试在 CMakeLists.txt 文件中使用选项,如下所示:
cmake_minimum_required(VERSION 3.5)
project(Tmuduo CXX)
...
set(CMAKE_CXX_STANDARD 11)
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
add_compile_options(-Wthread-safety )
endif()
add_compile_options(
# -DVALGRIND
-Wall
-Wno-unused-parameter
-Woverloaded-virtual
-Wpointer-arith
-Wwrite-strings
-O3
-rdynamic
)
...
Run Code Online (Sandbox Code Playgroud)
当我使用cmake .. -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clangand时make VERBOSE=1,我收到一些消息如下:

正如您所看到的,-rdynamic编译选项确实出现在 clang++ 命令中,并且编译器还抱怨该参数未使用。但是当我使用下面的命令时,奇怪的事情发生了。
cmake_minimum_required(VERSION 3.5)
project(Tmuduo CXX)
...
set(CMAKE_CXX_STANDARD 11)
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
add_compile_options(-Wthread-safety )
endif()
add_compile_options(
# -DVALGRIND
-Wall
-Wno-unused-parameter
-Woverloaded-virtual
-Wpointer-arith
-Wwrite-strings
-O3
-rdynamic
)
...
Run Code Online (Sandbox Code Playgroud)
一切顺利。这次,这个-rdynamic选项起作用了。这确实让我很困惑。谁能告诉我这是怎么回事?为什么 clang++ …