core/text_list下面是什么以及它是如何工作的?我正在检查core文件夹,但找不到有关text_list工作原理的说明。
app/design/frontend/base/default/template/core
<block type="core/text_list" name="before_body_end" as="before_body_end" translate="label">
<label>Page Bottom</label>
<block type="page/html_cookieNotice" name="global_cookie_notice" as ="global_cookie_notice" template="page/html/cookienotice.phtml" before="-" />
</block>
Run Code Online (Sandbox Code Playgroud) 我想在 64 位 ARM 上的 32 位地址空间内分配一个缓冲区。换句话说,我想确保我的缓冲区绑定到较低的 32 位地址空间。你知道有一个很好的 C 函数可以做到这一点吗?
我正在尝试设置一个 CMake 项目,在 Ubuntu 上使用 pybind11 为其 C++ 函数创建 python 绑定。
目录结构为:
pybind_test
arithmetic.cpp
arithmetic.h
bindings.h
CMakeLists.txt
main.cpp
pybind11 (github repo clone)
Repo contents (https://github.com/pybind/pybind11)
Run Code Online (Sandbox Code Playgroud)
文件CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(pybind_test)
set(CMAKE_CXX_STANDARD 17)
find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})
include_directories(pybind11/include/pybind11)
add_executable(pybind_test main.cpp arithmetic.cpp)
add_subdirectory(pybind11)
pybind11_add_module(arithmetic arithmetic.cpp)
target_link_libraries(pybind_test ${PYTHON_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)
arithmetic.cpython-36m-x86_64-linux-gnu.so存储库已成功构建并生成文件。如何将此共享对象文件导入到 python 中?
pybind11 文档中的文档有这一行
$ c++ -O3 -Wall -shared -std=c++11 -fPIC `python3 -m pybind11 --includes` example.cpp -o example`python3-config --extension-suffix`
Run Code Online (Sandbox Code Playgroud)
但我想使用 CMake 进行构建,并且我也不想每次运行 python 来使用此模块时都必须指定额外的包含目录。
我如何像普通的 python 模块一样将此共享对象文件导入到 python 中?
我使用的是 Ubuntu 16.04。
我需要在 C++ 中创建一个模板类。我需要确保模板参数的类型将是一个具有 1 个 int 字段和 1 个 string 字段的类(可以有更多字段,但这些是强制性的)。
例如,在 C# 中,我可以定义一个带有方法或属性的接口,如下所示:
interface MyInterface {
int GetSomeInteger();
string GetSomeString();
}
Run Code Online (Sandbox Code Playgroud)
然后我可以在我的模板类中使用它:
class MyClass<T> where T: MyInterface {}
Run Code Online (Sandbox Code Playgroud)
有没有办法在 C++ 中做这样的事情?
如何指示 Visual C++ 编译器 (1926) 使用未初始化的__m512i寄存器。在下面的代码片段not(or(A,B))中计算了a ,内容dummy无关紧要。
__m512i dummy;
const __m512i n8 = _mm512_ternarylogic_epi64(dummy, A, B, 0x11);
Run Code Online (Sandbox Code Playgroud)
不知何故,编译器假定寄存器需要有一些内容,(它没有),并为以下生成昂贵且不必要的内存引用zmm0:
62 F1 7E 48 6F 45 00 vmovdqu32 zmm0,zmmword ptr [rbp]
62 F3 DD 48 25 C5 11 vpternlogq zmm0,zmm4,zmm5,11h
Run Code Online (Sandbox Code Playgroud)
ICC 19.0.1 了解这种情况并且不会生成vmovdqu32.
我试过什么:dummy用 0初始化替换为vmovdqu32:
C5 F1 EF C9 vpxor xmm1,xmm1,xmm1
Run Code Online (Sandbox Code Playgroud)
这仍然给出了不必要的指令和停顿。
因此问题是:如何指示 Visual C++ 编译器执行与 Intel 编译器相同的操作?只是不要初始化虚拟寄存器。
假设我用 C/C++ 编写了一个程序并希望允许加载插件。典型的解决方案是将插件编写为:
插件.c
int my_plugin_fn() {
return 7;
}
Run Code Online (Sandbox Code Playgroud)
并使用类似的东西编译它gcc -fpic -shared -o plugin.so plugin.c
然后,在加载这个插件的主程序中,我们可能有:
加载器.c
#include <stdio.h>
#include <dlfcn.h>
int main() {
void *plugin_handle = dlopen("./plugin.so", RTLD_LAZY);
if (!plugin_handle) {
printf("Could not open shared object: %s\n", dlerror());
return -1;
}
int (*fn)() = dlsym(plugin_handle, "my_plugin_fn");
char *err = dlerror();
if (err) {
printf("Could not resolve symbol: %s\n", err);
return -1;
}
printf("Plugin object returned: %d\n", fn());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我用 编译了 loader.c gcc -o loader …
我不知道这是否被认为是一种好的编程习惯,但就我个人而言,我发现通过命名函数的参数来调用函数会使代码更具可读性。我不知道这在 Rust 编程语言中是否可行。我在语法中没有找到任何命名的调用表达式:
https://doc.rust-lang.org/reference/expressions/call-expr.html
因此,例如以下不能编译:
fn add(n1 : i32, n2 : i32) -> i32 {
n1 + n2
}
fn main() {
let sum_value = add(n1 = 124, n2 = 200);
println!("sum = {}", sum_value);
}
Run Code Online (Sandbox Code Playgroud)
因此,我的问题是:在 Rust 中是否可以在函数调用中命名参数,如果答案是肯定的,根据 Rust 最佳实践,它是否被认为是一种好的做法?(我是初学者)
环境:
OS: Linux Ubuntu MATE 20.04.1 (64 bits)
rustc --version: rustc 1.46.0 (04488afe3 2020-08-24)
Run Code Online (Sandbox Code Playgroud) ODR允许我们多次定义相同的内联函数(有一些限制)。
但是,简单的static函数情况又如何呢?
// First TU
static int foo() { return 0; }
int bar1() { return foo(); }
// Second TU
static int foo() { return 1; }
int bar2() { return foo(); }
Run Code Online (Sandbox Code Playgroud)
如果我们快速阅读[basic.def.odr] p4,我们可以天真的得出结论,那就是UB:
每个程序应准确地包含在该程序中被丢弃的语句之外的每个非内联函数或变量的一个定义(9.4.1);无需诊断。
在C ++标准中哪里指定了每个foo函数都是不同的函数,因此即使它们具有相同的名称,也不会破坏ODR?
仅仅是阅读[basic.link] p2.2的问题(即,由于内部链接,名称不指向同一实体,因此[basic.def.odr] p4在这里不适用)?还是做出决定时涉及更多细微差别/规则(例如[basic.scope]中的内容)?
请注意,使用未命名的名称空间,结果很明显,因为名称已经是不同的/唯一的。
我正在尝试将打包的数据结构写出到二进制文件中,但是正如您从od -x下面看到的那样,结果的顺序并不符合预期。我在 64 位 Intel 系统上使用 gcc。有谁知道为什么顺序是错误的?它看起来不像字节序问题。
#include <stdio.h>
#include <stdlib.h>
struct B {
char a;
int b;
char c;
short d;
} __attribute__ ((packed));
int main(int argc, char *argv[])
{
FILE *fp;
fp = fopen("temp.bin", "w");
struct B b = {'a', 0xA5A5, 'b', 0xFF};
if (fwrite(&b, sizeof(b), 1, fp) != 1)
printf("Error fwrite\n");
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
ASCII 61 是'a',所以b.a成员。ASCII 62 是'b',所以b.c成员。奇怪的0xA5A5是如何在序列中展开。
$ od -x temp.bin
0000000 a561 00a5 …Run Code Online (Sandbox Code Playgroud) 例如,下面是一条 X86-64 指令:
movq (%rdi),%rdi
Run Code Online (Sandbox Code Playgroud)
它读取内容(由 指向%rdi)并将此内容设置为%rdi,这在时序逻辑中是否有效?
或者我们是否必须将其分配给不同的寄存器并将其移回:
movq (%rdi), %rsi
movq rsi, %rdi
Run Code Online (Sandbox Code Playgroud) c++ ×5
c ×3
linux ×2
32bit-64bit ×1
arm ×1
assembly ×1
avx512 ×1
c++-concepts ×1
cmake ×1
dlopen ×1
instructions ×1
intrinsics ×1
linkage ×1
magento-1.9 ×1
pybind11 ×1
python ×1
rust ×1
static ×1
templates ×1
visual-c++ ×1
x86-64 ×1