小编Ili*_*llo的帖子

在编译一个相当简单的c ++ 11程序时,gcc和clang之间的结果不同

我试图了解这个简单的C++ 11程序输出中gcc与clang暴露的不同行为是否是由于clang中的错误(Xcode 5.0.2,OS X 10.8.5).代码如下:

#include <iostream>

int main() {


    int matrix[][3]{{1,2,3}, {4,5,6}, {7,8,9}};
    auto dyn_matrix = new int[3][3]{{1,2,3}, {4,5,6}, {7,8,9}};

    std::cout << matrix[0][1] << std::endl;
    std::cout << dyn_matrix[0][1] << std::endl;

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

如图所示,我正在尝试使用统一初始化来初始化一个大小的匿名(resp.命名)多维数组3x3.使用MacPorts中的gcc 4.7进行编译时,可以获得预期的输出:

$g++-mp-4.7 -std=c++11 dyn_matrix.cpp -o dyn_matrix 
$ ./dyn_matrix
2
2
$
Run Code Online (Sandbox Code Playgroud)

相反,在使用clang的情况下,输出读取:

$ clang++ -std=c++11 -stdlib=libc++ dyn_matrix.cpp -o dyn_matrix_clang
$ ./dyn_matrix_clang 
2
4
$  
Run Code Online (Sandbox Code Playgroud)

在这种情况下,结果(显然)是错误的.clang --version报告:

Apple LLVM version 5.0 (clang-500.2.75) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin12.5.0
Thread model: posix
Run Code Online (Sandbox Code Playgroud)

谁应该受到责备?我,gcc还是clang? …

c++ gcc clang c++11

56
推荐指数
1
解决办法
2723
查看次数

Mersenne twister热身与再现性

在我目前的C++ 11项目中,我需要执行M模拟.对于每个模拟m = 1, ..., M,我使用一个std::mt19937对象随机生成一个数据集,构造如下:

std::mt19937 generator(m);
DatasetFactory dsf(generator);
Run Code Online (Sandbox Code Playgroud)

根据/sf/answers/1085695971//sf/answers/1044704531/,Mersenne Twister PRNG受益于热身阶段,目前我的代码中没有.为方便起见,我提出了建议的代码片段:

#include <random>

std::mt19937 get_prng() {
    std::uint_least32_t seed_data[std::mt19937::state_size];
    std::random_device r;
    std::generate_n(seed_data, std::mt19937::state_size, std::ref(r));
    std::seed_seq q(std::begin(seed_data), std::end(seed_data));
    return std::mt19937{q};
}
Run Code Online (Sandbox Code Playgroud)

在我的情况下的问题是我需要结果的可重复性,即在不同的执行中,对于每个模拟,数据集必须是相同的.这就是为什么在我目前的解决方案中,我使用当前的模拟种子Mersenne Twister PRNG.在我看来,使用std::random_device防止数据是相同的(AFAIK,这是确切的目的std::random_device).

编辑:通过不同的执行我的意思是重新启动可执行文件.

如何在不影响再现性的情况下在代码中引入上述预热阶段?谢谢.

可能的解决方案#1

这是基于@SteveJessop的第二个提案的暂定实现

#include <random>

std::mt19937 get_generator(unsigned int seed) {
        std::minstd_rand0 lc_generator(seed);
        std::uint_least32_t seed_data[std::mt19937::state_size];

        std::generate_n(seed_data, std::mt19937::state_size, std::ref(lc_generator));
        std::seed_seq q(std::begin(seed_data), std::end(seed_data));
        return std::mt19937{q};
    }
Run Code Online (Sandbox Code Playgroud)

可能的解决方案#2

这是基于@SteveJassop和@AndréNeve联合贡献的暂定实施.该sha256功能改编自/sf/answers/744290781/

#include <openssl/sha.h>
#include …
Run Code Online (Sandbox Code Playgroud)

c++ random prng mersenne-twister c++11

15
推荐指数
1
解决办法
2591
查看次数

使用Eigen的子矩阵和指数

我正在研究一个MATLAB项目,我想用C++和Eigen重新实现计算量最大的部分.我想知道是否有办法执行以下操作(MATLAB语法):

B = A(A < 3);
Run Code Online (Sandbox Code Playgroud)

对于那些不熟悉MATLAB的人,上述命令初始化由A中单元格构成的矩阵B,其值小于3.

我从Eigen论坛的帖子中看到,可以通过以下方式获得感兴趣的指数:

MatrixXi indices = (A.array() < 3).cast<int>();
Run Code Online (Sandbox Code Playgroud)

我想拥有的是:

MatrixXd B = A(A.array() < 3);
Run Code Online (Sandbox Code Playgroud)

谢谢.

c++ vectorization submatrix eigen

14
推荐指数
3
解决办法
9701
查看次数

在JSE中使用JPA的EntityManager ThreadLocal模式

我正在使用Struts 1.3 + JPA(Hibernate作为持久性提供程序)开发一个简单的"Book Store"项目.我无法切换到Spring或任何其他更复杂的开发环境(例如,Jboss),我不能使用任何特定于Hibernate的技术(例如,Session类).

鉴于我在JSE环境中,我需要明确管理整个EntityManager的生命周期.

Book实体定义如下:

@Entity
public class Book {

@Id private String isbn;
private String title;
private Date publishDate;

    // Getters and Setters
}
Run Code Online (Sandbox Code Playgroud)

我定义了三个Action类,分别负责检索所有书籍实例,通过其ISBN检索单个书籍实例并将分离的书籍合并到数据库中.

为了增加业务逻辑代码和数据访问代码之间的关注点分离,我引入了一个简单的BookDAO对象,负责执行CRUD操作.理想情况下,应将所有与数据访问相关的调用委托给持久层.例如,ListBookAction定义如下:

public class ListBookAction extends Action {

    private BookDAO dao = new BookDAO();

    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        // Retrieve all the books
        List<Book> books = dao.findAll();

        // Save the result set
        request.setAttribute("books", …
Run Code Online (Sandbox Code Playgroud)

struts entity hibernate thread-safety jpa-2.0

12
推荐指数
1
解决办法
9599
查看次数

从std :: tuple <some_types ...>开始创建子元组

让我们假设std::tuple<some_types...>给出了一个.我想创建一个新std::tuple的类型是索引的类型[0, sizeof...(some_types) - 2].例如,让我们假设起始元组是std::tuple<int, double, bool>.我想获得一个定义为的子元组std::tuple<int, double>.

我对可变参数模板很新.作为第一步,我试着写一个struct负责存储不同类型的原始文件std::tuple,目的是创建一个同类的新元组(如std::tuple<decltype(old_tuple)> new_tuple).

template<typename... types>
struct type_list;

template<typename T, typename... types>
struct type_list<T, types...> : public type_list<types...>  {
    typedef T type;
};


template<typename T>
struct type_list<T> {
    typedef T type;
};
Run Code Online (Sandbox Code Playgroud)

我想做的是:

std::tuple<type_list<bool, double, int>::type...> new_tuple // this won't work
Run Code Online (Sandbox Code Playgroud)

下一步是丢弃参数包中的最后一个元素.如何访问type存储的几个type_list?以及如何丢弃其中一些?

谢谢.

c++ templates variadic-templates c++11 stdtuple

4
推荐指数
2
解决办法
2895
查看次数

将`std :: addressof`和`operator&`一起引入学生会不会有任何缺点?

我是编程入门课程的助教,我们教C++ 11.特别是,我的部分是关于内存管理的基础知识(值与参考语义,存储持续时间,自动与动态对象等).

可以预见的是,学生们发现这部分非常相似(对于绝大多数人来说,这是他们第一次听到这些内容).他们必须面对的主要问题之一是学习如何区分&符号的不同含义(定义左值引用与获取左值的地址).为此,由于我们使用的是C++ 11,我想知道是否有意义来呈现该std::addressof功能.

这可以帮助消除任何歧义.以下片段:

int b = 10;
int* a = &b;
int& c = b;
Run Code Online (Sandbox Code Playgroud)

可能成为:

int* a = std::addressof(b);
int& c = b;
Run Code Online (Sandbox Code Playgroud)

并且&它将恰好与一个含义相关联:定义左值引用.从一方面来看似乎是合理的,因为:

  • 重点不在于培训C++程序员(更高级的课程切换到Java),以及
  • 我仍然可以提供运算符的地址std::addressof.

我看到的缺点是教一些不是惯用的东西.鉴于列表中的第一颗子弹,这可能没问题.然而,我最担心的是我目前无法预见的技术缺点(例如,运行时成本).

c++ c++11

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