小编Snp*_*nps的帖子

数组的内存对齐方式

我在Cell处理器上调整DMA传输的内存时遇到问题.我需要地址的最后4位为0.

我有4个数组,unsigned int其中每个元素必须在内存中对齐,以便其(十六进制)地址以零结尾.

例如

int main()
{
    size_t i;

    static unsigned int a[2] __attribute__ ((aligned (16)));
    static unsigned int b[2] __attribute__ ((aligned (16)));
    static unsigned int c[2] __attribute__ ((aligned (16)));
    static unsigned int d[2] __attribute__ ((aligned (16)));

    for (i = 0; i < 2; ++i) {
        printf("a[%u] = %p\n", &a[i]);
        printf("b[%u] = %p\n", &b[i]);
        printf("c[%u] = %p\n", &c[i]);
        printf("d[%u] = %p\n", &d[i]);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

a[0] = 0x10010b60
b[0] = 0x10010b50
c[0] = 0x10010b40 …
Run Code Online (Sandbox Code Playgroud)

c memory-alignment dma

8
推荐指数
2
解决办法
1万
查看次数

如果它们有副作用,可以将功能优化掉吗?

我想在主线程上初始化一些静态数据.

int32_t GetFoo(ptime t)
{
   static HugeBarData data;
   return data.Baz(t);
}

int main()
{
    GetFoo(); // Avoid data race on static field. 
              // But will it be optimized away as unnecessary?

    // Spawn threads. Call 'GetFoo' on the threads.
}
Run Code Online (Sandbox Code Playgroud)

如果编制者可能决定删除它,我怎么能强迫它留在那里?

c++ optimization static

8
推荐指数
1
解决办法
752
查看次数

在C++ 11中使用lambda默认捕获值或引用的缺点?

在C++ 11 中使用value([=])或reference([&])使用lambda默认捕获有什么缺陷?

我知道一些陷阱,如:

  • 如果从lambda创建的闭包的生命周期超过了局部变量的生命周期,那么闭包中的引用将是悬空的?

按值划分的默认值是否有任何缺点?

c++ lambda

8
推荐指数
3
解决办法
1907
查看次数

使用迭代器的初始化列表构造容器

可以使用迭代器范围构造一个向量,如下所示:

std::vector<std::string> vec(std::istream_iterator<std::string>{std::cin},
                             std::istream_iterator<std::string>{});
Run Code Online (Sandbox Code Playgroud)

但我也可以使用C++ 11统一初始化语法编译和运行代码(注意括号),如下所示:

std::vector<std::string> vec{std::istream_iterator<std::string>{std::cin},
                             std::istream_iterator<std::string>{}};
Run Code Online (Sandbox Code Playgroud)

这里到底发生了什么?

我知道采用初始化列表的构造函数优先于其他形式的构造.编译器是否应该解析为构造函数采用包含2个元素的初始化列表std::istream_iterator?这应该是一个错误,因为std::istream_iterator无法转换为矢量值类型std::string,对吧?

c++ iterator uniform-initialization c++11

7
推荐指数
1
解决办法
796
查看次数

将rvalue引用传递给const lvalue reference paremeter

我试图理解C++ 11 rvalue引用以及如何在我的代码中使用它们以获得最佳性能.

假设我们有一个类A,它有一个指向大量动态分配数据的成员指针.

此外,一种foo(const A& a)与类对象做某事的方法A.

我希望防止在将A对象A传递给函数时调用复制构造函数foo,因为在这种情况下它将执行底层堆数据的深层复制.

我测试了传递左值参考:

    A a;
    foo(a);
Run Code Online (Sandbox Code Playgroud)

并传递右值引用:

    foo(A());
Run Code Online (Sandbox Code Playgroud)

在这两种情况下都没有调用复制构造函数.

这是预期的还是由于我的编译器(Apple LLVM 5.1)的一些优化?这有什么说明吗?

c++ rvalue lvalue const-reference c++11

6
推荐指数
1
解决办法
6115
查看次数

如何将毫秒添加到自纪元以来的持续时间?

仅使用std::chrono库,我有一个 type 变量unsigned long,表示从 1970 年 1 月 1 日到现在的毫秒数,我想向它添加 100 毫秒。

unsigned long now = std::chrono::system_clock::now().time_since_epoch().count();
unsigned long t100ms = std::chrono::milliseconds(100).count();
unsigned long time = now + t100ms;
Run Code Online (Sandbox Code Playgroud)

打印时t100ms,我得到“ 1000”。

如果我打印std::chrono::system_clock::nowevery second的值,我会看到每次迭代时递增的数字不会增加 1000(因为 1 秒等于 1000 毫秒,应该是这种情况)。

难道std::chrono::system_clock::now().time_since_epoch()不返回自1970年1月1日以毫秒为单位来表示已经经过的时间量?

c++ time c++-chrono

6
推荐指数
1
解决办法
1万
查看次数

如何折叠逗号?

以下行是如何展开的?

template <class... Ts>
void print_all(std::ostream& os, Ts const&... args) {
    (void(os << args), ...);
}
Run Code Online (Sandbox Code Playgroud)

应用规则,

一元右折(E op ...)变为E 1 op(... op(E N-1 op E N))

cppreference提供,

E  = void(os << args)
op = , 
Run Code Online (Sandbox Code Playgroud)

然后扩张成为

void(os << args[0], ..., (args[N-3], (args[N-2], args[N-1])) )
Run Code Online (Sandbox Code Playgroud)

怎么样

v.push_back(args), ...
Run Code Online (Sandbox Code Playgroud)

它变成了吗?

v.push_back(args[0], (args[1], ..., (args[N-2], args[N-1])))
Run Code Online (Sandbox Code Playgroud)

扩展和括号都令人困惑.有人解释一下吗?

c++ c++17

6
推荐指数
1
解决办法
975
查看次数

使用std :: cout添加时间戳

我有以下代码将我的std::cout输出重定向到日志文件.

std::ofstream out("out.txt");
std::streambuf *coutbuf = std::cout.rdbuf(); //save old buf
std::cout.rdbuf(out.rdbuf()); //redirect std::cout to out.txt!
Run Code Online (Sandbox Code Playgroud)

现在我想要的是,每当发生换行时,当前时间戳将被写入文件.

我知道我可以用以下方法实现:

std::cout << getTime() << "printing data" << std::endl;
Run Code Online (Sandbox Code Playgroud)

但我想要的是以std::cout某种方式自动处理它.那可能吗?

c++ logging iostream

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

C++ 11 <thread> get_id()和native_handle()之间的区别

什么是C++ 11个函数之间的差异get_id()native_handle()

在我创建的测试程序中,它们int为线程返回相同的值,所以我不知道它的区别是什么.

我在Windows上使用GCC 4.8.1.

multithreading c++11

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

动态设置docker容器的JAVA_HOME

我的 docker 容器需要设置 JAVA_HOME。我已将其添加到 Dockerfile 中,如下所示

ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/jre
Run Code Online (Sandbox Code Playgroud)

但是,这是值的硬编码。有没有办法可以从图像本身动态获取这个值

java-home docker dockerfile

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